[路飞]_返回倒数第 k 个节点

178 阅读1分钟

题目介绍

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

示例

输入: 1->2->3->4->5 和 k = 2
输出: 4

说明:

给定的 k 保证是有效的。
面试题 02.02. 返回倒数第 k 个节点
b站视频

解题思路

解法一:双指针

  1. 首先定义快慢指针 p、q 分别指向 head
  2. 快指针 q 先往前走 k 步
  3. p、q指针同时往前走
  4. 当 q 走到 null 时,p 指针的位置即为倒数第 k 个节点

2.gif

解题代码

var kthToLast = function(head, k) {
    // 定义快指针q,慢指针p
    let p = q = head
    // 快指针先走 k 步
    while (k--) {
        q = q.next
    }
    // 快慢指针同时走,当快指针走到null时结束
    while (next) {
        p = p.next
        q = q.next
    }
    // 返回 p 的值,即为倒数第 k 个节点
    return p.val
};

解法二:两次循环

  1. 定义 n 用于记录链表的长度,定义 p 指针指向 head
  2. 当 p 指针不为 null 时,将 p 指针指向其下一个节点,同时 n + 1
  3. 当 p 指针走到 null 时,计算 n - k 的值,同时将 p 指针指向 head
  4. p 指针继续往前走 n - k 步
  5. 最终 p 指向的节点即为倒数第 k 个节点

3.gif

解题代码

var kthToLast = function(head, k) {
    // 定义 n 记录链表长度,p 指针指向头节点
    let n = 0, p = head
    // p 指针遍历整个链表,记录链表长度
    while (p) {
        p = p.next
        n++
    }
    // p 指针从头节点重新开始
    p = head
    // 计算 n - k 的值,即 p 指针需要走几步到达倒数第 k 个节点
    let t = n - k
    // p 指针往前走 t 步
    while (t--) {
        p = p.next
    }
    // 返回 p 指针指向节点的值
    return p.val
};