题目介绍
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
示例
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
给定的 k 保证是有效的。
面试题 02.02. 返回倒数第 k 个节点
b站视频
解题思路
解法一:双指针
- 首先定义快慢指针 p、q 分别指向 head
- 快指针 q 先往前走 k 步
- p、q指针同时往前走
- 当 q 走到 null 时,p 指针的位置即为倒数第 k 个节点
解题代码
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
};
解法二:两次循环
- 定义 n 用于记录链表的长度,定义 p 指针指向 head
- 当 p 指针不为 null 时,将 p 指针指向其下一个节点,同时 n + 1
- 当 p 指针走到 null 时,计算 n - k 的值,同时将 p 指针指向 head
- p 指针继续往前走 n - k 步
- 最终 p 指向的节点即为倒数第 k 个节点
解题代码
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
};