快慢指针
解决的问题:
找到一个链表的倒数第n个节点
原理
定义两个指针 fast 和 slow 都指向head节点,先让fast指针向前移动n个节点,这时再让slow指针开始向后移动。
当fast为NULL时,slow刚好就停在了倒数第n个节点的位置。
例题一:
(剑指offer)输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
代码:
struct ListNode* getKthFromEnd(struct ListNode* head, int n){
struct ListNode* fast = head,*slow = head;
int i = 0;
while(fast)
{
if(i < n)
{
fast = fast -> next;
i++;
}else
{
fast = fast -> next;
slow = slow -> next;
}
}
return slow;
}
例题二
(leecode)实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
代码:
int kthToLast(struct ListNode* head, int k){
struct ListNode *fast = head ,*slow = head;
for(int i = 0;i < k;i++)
{
fast = fast->next;
}
while(fast)
{
fast = fast->next;
slow = slow->next;
}
return slow->val;
}