1. 程式人生 > 其它 >【雙指標又跑百分百】劍指 Offer 22. 連結串列中倒數第k個節點——雙指標求解

【雙指標又跑百分百】劍指 Offer 22. 連結串列中倒數第k個節點——雙指標求解

技術標籤:劍指offer指標leetcode單鏈表

原題連結

題目描述

輸入一個連結串列,輸出該連結串列中倒數第k個節點。
為了符合大多數人的習慣,本題從1開始計數,即連結串列的尾節點是倒數第1個節點。
例如,一個連結串列有6個節點,從頭節點開始,
它們的值依次是1、2、3、4、5、6。這個連結串列的倒數第3個節點是值為4的節點。

示例

給定一個連結串列: 1->2->3->4->5, 和 k = 2.

返回連結串列 4->5.


解法一:求長度鎖定目標位置

思路:

  1. 根據之前做的劍指offer題目,這個連結串列不出意外是個不帶頭結點的連結串列
  2. 先遍歷一遍,求出整個連結串列的長度len
  3. 目標結點的位置(從0開始的索引) = len - k
  4. 遍歷,直接拿目標結點即可

程式碼:

public ListNode getKthFromEnd(ListNode head, int k) {
    // 目標結點所在的位置
    int index = getLength(head) - k;
    ListNode result = new ListNode(0);
    ListNode p = head;
    // 遍歷連結串列
    while (p != null){
        if(index-- == 0){;.
            result = p;
            break
; } p = p.next; } return result; } /* 從頭結點開始遍歷,求出連結串列的長度*/ private int getLength(ListNode head) { int result = 0; ListNode p = head; while (p != null){ ++result; p = p.next; } return result; }

提交結果

解法二:雙指標

思路:

  1. 設立兩個遊標a, b,最初同時指向頭結點
  2. 遊標a向前走k步,使得a和b相差k
  3. 自此以後a , b 同時運動
  4. 當a走過最後一個結點時,b正指向倒數第k個結點,返回即可

程式碼:

/* 雙指標 */
public ListNode getKthFromEnd(ListNode head, int k) {
    ListNode a = head, b = head;
    // a往後走k步
    for (int i = 0; i < k; i++) {
        a = a.next;
    }
    // a, b同時往後運動
    while (a != null){
        a = a.next;
        b = b.next;
    }
    return b;
}

提交結果: