「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
题目:
面试题 02.02. 返回倒数第 k 个节点
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意: 本题相对原题稍作改动
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
给定的 k 保证是有效的。
思路:
- 执行一遍while循环,求出链表的长度
n - 对节点进行
n - k次循环,求出倒数第k位的元素
实现:
var kthToLast = function (head, k) {
let count = 1;
let cur = head;
// 先求长度
while (cur.next) {
cur = cur.next;
count++;
}
// 找到倒数K位在正着数时候的位置
let index = count - k;
while (index) {
head = head.next;
index--;
}
//返回节点
return head.val;
};
优化:
由于题目已经保证K是有效的,所以我们可以利用双指针的思想, 让快指针先走K步,当快指针走到终点时,慢指针所在的位置就是我们求解的值
优化代码
var kthToLast2 = function (head, k) {
let cur = head;
while (cur) {
// 先让快指针走K步,然后再一起走
cur = cur.next;
if (k) {
k--;
} else {
head = head.next;
}
}
return head.val;
};
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。