算法---链表中倒数第k个节点

“ 最近由于公司项目多,搁置了文章算法分享,扶我起来我还能再写,话不多说进入今日分享算法。”

1. 链表中倒数第k个节点

老规矩,链表在这里我就不介绍了,不懂的可以去网上搜索看相关的文章之后再来做这道题,先把题目给大家看看,如下所示:
链表中倒数第k个节点
剑值offer-题号22

友情提示:在这里的时候希望小伙伴先不要往下翻,先想想思路然后再看我接下来的分析。

2. 题解思路

这一类的题我们很快就会联想到快慢指针,当时切入点是什么呢?如何和快慢指针进行联系呢?不卖关子了,答案会在我画的下面这幅图中揭晓。
题解思路
思路导向图

从上面的图中可以推导出快指针(fast)初始next k次,而慢指针(slow)指向初始head头部,然后fast和slow同时next,当fast指向null时停止next,这时slow指向即为最终所求值。
其实推到过程为逆向思维,路线1和路线2总长相等,并且k也是相等的,那么总长-k为剩余长度也是相等的,不知道大家对这幅图有没有什么启发,接下来就是公布代码时刻。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var getKthFromEnd = function(head, k) {
let slow = head;
let fast = head;
while (k--) {
fast = fast.next;
}
while (fast !== null) {
fast = fast.next;
slow = slow.next;
}
return slow;
};

如果有更优的解,欢迎在下面留言,膜拜大佬抱大腿。