面试题 02.02. 返回倒数第 k 个节点
题目描述:实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
int kthToLast(struct ListNode* head, int k)
{
//创建快慢指针
ListNode* slow = head;
ListNode* fast = head;
//快指针先走k个结点
while(k--)
{
fast = fast->next;
}
while(fast)
{
slow = slow->next;
fast = fast->next;
}
return slow->val;
}
解题思路:
解决这个问题的核心思想是:通过在两个指针之间制造并保持一个固定的距离差,当一个指针到达终点时,另一个指针就正好在我们想要的位置上。
想象一下两个指针在一个链表上移动:
- 我们想找到距离终点
k
的位置。 - 我们先让指针 A(我们称之为
fast
指针)从起点出发,先走k
步。 - 然后,让指针 B(我们称之为
slow
指针)也从起点出发。 - 现在,A 和 B 同时以相同的速度(每次一步)向前走。
- 因为 A 和 B 之间始终保持着
k
步的距离差,所以当 A 到达终点时,B 所在的位置,正好就是距离终点k
步的地方。