题目描述:
设计一个算法判断一个单链表中是否有环,如果有,找到环的入口点并返回,否则返回NULL。
算法思路:
设置两个指针,一个是快指针fast,一个是慢指针slow,初始都指向链表的头部,每次fast指针走两个,即fast=fast->next->next,而慢指针slow每次走一个,即slow=slow->next;
由于快指针比慢指针走得快,所以若链表中有环,则两个指针最终会相遇,这就可以判断出一个链表中是否有环了。
代码如下:
LNode* FindLoop(LNode *head){
LNode *fast=head,*slow=head; //设置两个快慢指针
while(slow!=NULL&&fast->next!=NULL){
slow=slow->next;
fast=fast->next->next;
if(slow==fast) break;
}
if(slow==NULL || fast->next==NULL){
return NULL; //没有环,返回NULL
}
LNode *p1=head,*p2=slow; //分别指向开始点和相遇点
while(p1!=p2){
p1=p1->next;
p2=p2->next;
}
return p1; //返回入口点
}