判斷一個單向鏈表中是否有環

來源:互聯網
上載者:User

來自於:http://blog.sina.com.cn/s/blog_5f0d72800100tayr.html

思路:
   用兩個指標,pSlow,pFast,就是一個慢一個快
   慢的一次跳一步
   快的一次跳兩步
   往鏈表末端移動。如果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)
                       return true;
       }       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("malloc failed");
           else
           {
                 head->data=value;
                 head->next=NULL;
           }
      }
      else
       {
           node *temp=(node *)malloc(sizeof(node));
           if(temp==NULL)
            

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.