02.02. 返回倒數第 k 個節點
阿新 • • 發佈:2022-03-08
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