連結串列面試題(九)---判斷一個連結串列是否帶環

gogogo_sky發表於2017-05-17

一、結構體定義

typedef int DataType;

typedef struct ListNode//定義結點
{
    DataType data;
    struct ListNode* next;
}ListNode,*PListNode;

typedef struct  PList//定義一個成員是指向結點的指標的結構體
{
    PListNode PHead;
}PList,*PList;

二、函式實現
思路:判斷一個連結串列是否帶環的方法是:取兩個指標a和b,一開始兩個指標都指向連結串列的第一個結點;
然後讓a指標以每次走一步的走法向前走,b指標以每次走兩步的走法向前走,兩個正指標同時開始走,如果連結串列帶環,那麼快慢指標終究會在環內一點相交;返回快慢指標的交點即可;

//9.判斷一個連結串列是否帶環,返回前後指標相遇的交點---前後指標法;
PListNode CheakCycle(PListNode PHead)
{
    PListNode fast=NULL;//每次走兩步
    PListNode slow=NULL;//每次走一步
    fast=PHead;
    slow=PHead; 
   while (fast&&fast->next)//判斷fast->next不為NULL,是為了防止下面fast->next->next對NULL指標訪問,發生錯誤
   {
       fast=fast->next->next;
       slow=slow->next;
       //帶環
       if (fast==slow)
       {
           return fast;
       }
   }
   //不帶環
   return NULL;
}

相關文章