[路飞]_算法_链表_ 链表中倒数第k个节点(快慢指针)

118 阅读2分钟

题目描述

输入一个链表,输出该链表中倒数第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;

};