1.判断是否是环形链表

bool hasCycle(struct ListNode *head)
{
struct ListNode *fast,*slow;
fast=slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
return true;
}
return false;
}
2.环形链表2.0

思考:

slow走的路程:L+X
fast走的路程:L+N*C+X
2*(L+X)=L+N*C+X
L=N*C-X
结论:一个指针从相遇点开始走,另一个指针从起始点开始走,他们会在入口点相遇
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode *fast,*slow;
fast=slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
{
struct ListNode *meet=slow;
struct ListNode *start=head;
while(meet!=start)
{
start=start->next;
meet=meet->next;
}
return meet;
}
}
return NULL;
}