[路飞]_剑指Offer22.链表中倒数第K个节点(双指针)

293 阅读1分钟

「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

LeetCode剑指 Offer 22.链表中倒数第k个节点

题目要求

    输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
    例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

示例

给定一个链表: 1->2->3->4->5, 和 k = 2.​ 返回链表 4->5.

思路

还是使用双指针,快指针先移动k步(同时要保证移动k步的时候快指针一直是一个有效的值),然后快慢指针同时移动,快指针为null的时候,此时的慢指针就是题目要求的倒数第K个节点

1. 声明快慢指针,快指针移动k步并且保证快指针是个有效值

let slow = head;
let fast = head;
for (let i=0; i<k; i++) {  
    if (fast == null) return false;  
    fast = fast.next;
}
2.快慢指针同时移动,快指针为null的时候慢指针的值就是题目要求的内容

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

完整代码

var getKthFromEnd = function(head, k) {    
    let slow = head;    
    let fast = head;    
    for (let i=0; i<k; i++) {        
        if (fast == null) return fast;        
        fast = fast.next;    
    }    while (fast != null) {        
        slow = slow.next;        
        fast = fast.next;    
    }    
    return slow;
};