如何判断一个链表是否有环?

 如何判断一个链表是否存在环?

 一般思路就是设置两个指针,都指向头结点,不同的是指针的速度不同,一个走的快,定义为快指针,一个走的慢定义为慢指针。倘若存在环形结构,快指针终将与慢指针相遇。

判断有环的代码
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;
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值