【雙指標又跑百分百】劍指 Offer 22. 連結串列中倒數第k個節點——雙指標求解
阿新 • • 發佈:2020-12-24
題目描述
輸入一個連結串列,輸出該連結串列中倒數第k個節點。
為了符合大多數人的習慣,本題從1開始計數,即連結串列的尾節點是倒數第1個節點。
例如,一個連結串列有6個節點,從頭節點開始,
它們的值依次是1、2、3、4、5、6。這個連結串列的倒數第3個節點是值為4的節點。
示例
給定一個連結串列: 1->2->3->4->5, 和 k = 2.
返回連結串列 4->5.
解法一:求長度鎖定目標位置
思路:
- 根據之前做的劍指offer題目,這個連結串列不出意外是個不帶頭結點的連結串列
- 先遍歷一遍,求出整個連結串列的長度len
- 目標結點的位置(從0開始的索引) = len - k
- 遍歷,直接拿目標結點即可
程式碼:
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;
}
提交結果
解法二:雙指標
思路:
- 設立兩個遊標a, b,最初同時指向頭結點
- 遊標a向前走k步,使得a和b相差k
- 自此以後a , b 同時運動
- 當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;
}