02.02、[简单] 返回倒数第 k 个节点
1、题目描述
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
2、题解思路
本题的关键在于使用双指针法,通过两个指针(fast
和 slow
),让 fast
指针比 slow
指针先走 k
步,这样当 fast
到达链表末尾时,slow
正好指向倒数第 k
个节点。
具体步骤如下:
- 初始化两个指针
fast
和slow
,都指向链表的头节点。 - 让
fast
先走k
步,使得fast
和slow
之间的距离为k
。 - 同时移动
fast
和slow
,直到fast
到达链表的末尾。 - 此时,
slow
指针所指向的节点就是倒数第k
个节点,返回该节点的值。
3、详细代码解析
class Solution {
public:
int kthToLast(ListNode* head, int k) {
// 初始化两个指针,分别指向链表的头节点
ListNode* fast = head;
ListNode* slow = head;
// 让 fast 指针先走 k 步
while (k--) {
fast = fast->next;
}
// 同时移动 fast 和 slow,直到 fast 到达链表的末尾
// 当 fast 到达链表末尾时,slow 则正好指向倒数第 k 个节点,返回该节点的值
while (fast) {
fast = fast->next;
slow = slow->next;
}
// slow 现在指向倒数第 k 个节点,返回该节点的值
return slow->val;
}
};
4、时间复杂度与空间复杂度
- 时间复杂度:
O(n)
,其中n
为链表的长度。由于我们只遍历了链表一次,因此时间复杂度是线性的。 - 空间复杂度:
O(1)
,只用了两个指针,空间开销很小。
通过使用双指针技巧,我们可以在一次遍历中高效地找到倒数第 k
个节点。这个解法在不需要额外空间的情况下,能够很好地解决问题。