1. 程式人生 > 其它 >02.02. 返回倒數第 k 個節點

02.02. 返回倒數第 k 個節點

02.02. 返回倒數第 k 個節點

1、題目

實現一種演算法,找出單向連結串列中倒數第 k 個節點。返回該節點的值。

  • 示例

輸入: 1->2->3->4->5 和 k = 2
輸出: 4

2、初步作答

2.1 思路(錯誤

  • 連結串列選取倒數第幾個節點,需要先把整個連結串列資料讀取出來
  • 從讀取的資料選擇所需的資料

2.2 做法(錯誤

  • 建立一個collection集合用以儲存資料(collection集合按儲存順序存放)
  • 根據集合讀取資料

2.3 思考(錯誤思路的反思

  • 最終寫程式碼時,突然發現現實和理想的差距巨明顯
  • 錯誤程式碼
public int kthToLast(ListNode head, int k) {
    //題目給出k有效,所以不需要判斷比較head是否為空和k值是否大於連結串列長度
    int length = 0;
    ListNode a = head;
    if(a.next != null){
        length++;
        a = a.next;
    }
    int b = 0;
    for (int i = 0; i <= length-k; i++) {
        b = a.val;
        a = a.next;
    }
    return b;
}

3、二次思考

3.1 思路

  • 可以使用兩個指標(Fast,Slow)進行判斷
    • Fast指標首先遍歷 K 步(由於題目給出 K 值有效的定義,所以不需要對 K 進行判斷);
    • Fast向下遍歷,Slow跟Fast指標同步遍歷,直到Fast為空;

3.2 程式碼

public int kthToLast(ListNode head, int k) {
    ListNode fast=head,slow=head;
    while(k != 0){
        fast = fast.next;
        k--;
    }

    while(fast==null){
        fast = fast.next;
        slow = slow.next;
    }
    return slow.val;
}

執行用時:0 ms, 在所有 Java 提交中擊敗了100.00%的使用者

記憶體消耗:39.2 MB, 在所有 Java 提交中擊敗了20.41%的使用者

通過測試用例:208 / 208