题目描述
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/li… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
之前那道返回数组倒数第k个节点,我们用的是遍历用数组记录下值,然后直接查找数组倒数第k个值得方法 这次是直接返回链表,我们也可以用顺序查找得方式。
- 第一次遍历得到链表长度n
- 然后倒数第k个节点其实就是整数第n-k+1个节点(从1记,从0记的话就是n-k下标) 但今天,准备用另一种方式来解题,那就是快慢指针得方式
- 定义两个指针 快指针fast,慢指针slow
- 慢指针指向链表得head,快指针指向链表得第k+1个节点
- 这样慢指针正好是快指针后面第k个节点
- 两个指针同时走,当快指针走到链表末尾空指针的时候,慢指针停留得位置刚好离末尾节点有k个位置,就是倒数第k个节点
代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var getKthFromEnd = function(head, k) {
let fast=head, slow =head;
while(k>0){
fast=fast.next;
k--;
}
while(fast){
slow=slow.next;
fast=fast.next;
}
return slow;
};