判断一个单向链表中是否有环

 

判断一个单向链表中是否有环

 

来自于:http://blog.sina.com.cn/s/blog_5f0d72800100tayr.html

思路:
   用两个指针,pSlowpFast,就是一个慢一个快
   
慢的一次跳一步
   
快的一次跳两步
   
往链表末端移动。如果pFast==NULL,则说明链表没有环,如果pSlow==pFast,则说明链表存在环。

   这个方法与前面2个方法相比,不但速度很快,而且不需要额外的存储空间,时间复杂度、空间复杂度都是最小的。

bool IsLoop(node *head)
{
       node *pSlow=head;
       node *pFast=head;
       while(pSlow!=NULL&&pFast!=NULL)
       {
               pSlow=pSlow->next;
               pFast=pFast->next->next;
               if(pSlow==pFast)
                       returntrue;
       }

       returnfalse;
}

 

 

 

完整的测试代码如下:

#include "iostream"
using namespace std;
struct node
{
     int data;
      structnode *next;
}*linklist,*s,*head;

map<node*,int>m;

bool IsLoop(node *head)
{
     node *pSlow=head;
     node *pFast=head;
     while(pSlow!=NULL &&pFast!=NULL)
     {
           pSlow=pSlow->next;
           pFast=pFast->next->next;
           if(pSlow==pFast)
                 returntrue;
     }
     return false;
}
node* InsertNode(node *head,int value)
{
     if(head==NULL)
     {
           head=(node*)malloc(sizeof(node));
           if(head==NULL)
                 printf("mallocfailed");
           else
           {
                 head->data=value;
                 head->next=NULL;
           }
      }
      else
       {
           node*temp=(node *)malloc(sizeof(node));
           if(temp==NULL)
                 printf("mallocfailed");
           else
            {
                 temp->data=value;
                 temp->next=head;
                 head=temp;
            }
       }
       returnhead;
}
int main(void)
{
      node *t,*q,*p=NULL;
      p=InsertNode(p,8);
      p=InsertNode(p,7);
       p=InsertNode(p,6);
      p=InsertNode(p,5);
      p=InsertNode(p,4);
      q=p;
      p=InsertNode(p,3);
       p=InsertNode(p,2);
      p=InsertNode(p,1);
      t=p;
      while(t->next)       // 
找到链表的尾指针
              t=t->next;
       t->next=q;          //
将链表的尾指针指向第四个节点,这样就构成了一个环
      bool flag=IsLoop(p);
      if(flag)
            cout<<"
这个链表存在一个环"<<endl;
      else
             cout<<"
这个链表不存在一个环"<<endl;
      system("pause");
      return 0;
}

1->2->3->4->5->6->7->8 最后8又指向了4,构成了一个环

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值