1 判断链表是否带环
要先判断一个链表是否有环,最常用的方法是双指针法。
想象一下,如果两个人在环形赛道上跑步,那么不管他们之前的起点位置如何,跑得快的必将与跑得慢的相遇。在该题中,直接使用快慢指针,慢指针步长为1,快指针步长为2,如果出发后某一时刻快慢指针相遇,那么就说明链表带环。程序如下:
ListNode *detectCycle(ListNode *head) {
ListNode *fast=head;
ListNode *slow=head;
while(fast!=NULL&&fast->next!=NULL)
{
fast=fast->next->next;
slow=slow->next;
if(slow==fast)break;
}
if(fast==NULL||fast->next==NULL)return false;
return true;
}
2 环的长度
快慢指针相遇后,假设相遇点为M,如果继续向前走,不难想到,下一次相遇点依然是M(画一个环试一下就知道了),而且第二次相遇时,快指针走过两圈,慢指针走过一圈,然后在M点相遇。因此,当快慢指针相遇后,二者继续往前走,当再次相遇时,慢指针走过的长度即是环的长度。
int