如何判断一个链表是否存在环?
一般思路就是设置两个指针,都指向头结点,不同的是指针的速度不同,一个走的快,定义为快指针,一个走的慢定义为慢指针。倘若存在环形结构,快指针终将与慢指针相遇。
判断有环的代码
bool existCycle(list Node *head){
ListNode *fast(head),*slow(head);
while(fast && fast->next } //如果fast 和fast->next 都为真则执行循环体
{
fast=fast->next-next;
slow=slow-next;//快的结点每次走两步,慢的走一步。
if(fast==slow) //当指针相等时,表面链表中有环
return true;
else{
return false}
}
C++实现。
LinkList * ListLoop(LinkList *list) //判断一个链表中是否有环
{
int isLoop=0;
LinkList *fast,*slow;
fast=list;
slow=list;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;//fast每次两步,slow每次一步
if(fast==slow) //当两指针相等时,判断链表中有环
{
isLoop=1;
break;
}
}
if(isLoop==1)//链表中有环时
{
slow=list;
while(slow!=fast)//一个头指针,一个相遇点指针,两个第一次相等时为环入口点
{
slow=slow->next;
fast=fast->next;
}
return slow;
}
else
{
cout<<"链表中没有环";
return NULL;
}
}
{
int isLoop=0;
LinkList *fast,*slow;
fast=list;
slow=list;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;//fast每次两步,slow每次一步
if(fast==slow) //当两指针相等时,判断链表中有环
{
isLoop=1;
break;
}
}
if(isLoop==1)//链表中有环时
{
slow=list;
while(slow!=fast)//一个头指针,一个相遇点指针,两个第一次相等时为环入口点
{
slow=slow->next;
fast=fast->next;
}
return slow;
}
else
{
cout<<"链表中没有环";
return NULL;
}
}