快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。
1.寻找中间节点
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
思路:定义两个指针,都从头开始移动,快指针每次向前移动2步,满指针每次向前移动1步,当快指针移动到末尾的时候,慢指针刚好移动到中间位置。
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* fast=head;
struct ListNode* slow=head;
while(fast&&fast->next)//保证快指针和它的下一个指针都不为空,
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
2.寻找倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。
思路:定义两个指针,快指针比慢指针先走k步,等到快指针遍历完整个链表的时候,慢指针刚好走到倒数第K个节点。
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
struct ListNode* fast=pListHead;
struct ListNode* slow=pListHead;
while(k--)
{
if(fast)
{
fast=fast->next;
}
else
return NULL;
}
while(fast)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}