判斷乙個單鏈表是否有環

2021-06-14 01:34:28 字數 926 閱讀 2859

一、判斷鍊錶是否存在環

/*

設定兩個指標(fast, slow),初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入

環,而slow後進入環,兩個指標必定相遇。(當然,fast先行頭到尾部為null,則為無環鏈表)程式如下:

*/bool i***itsloop(listnode* head)

return !(fast==null || fast->next==null);

}

二、找到環的入口點

/*

當fast若與slow相遇時,slow肯定沒有走遍歷完鍊錶,而fast已經在環內迴圈了n圈(1<=n)。假設slow走了s步,則fast走了

2s步(fast步數還等於s 加上在環上多轉的n圈),設環長為r,則:

2s = s + nr

s= nr

設整個鍊錶長l,入口環與相遇點距離為x,起點到環入口點的距離為a。

a + x = nr

a + x = (n – 1)r +r = (n-1)r + l - a

a = (n-1)r + (l – a – x)

(l – a – x)為相遇點到環入口點的距離,由此可知,從煉表頭到環入口點等於(n-1)迴圈內環+相遇點到環入口點,於是我們

從煉表頭、與相遇點分別設乙個指標,每次各走一步,兩個指標必定相遇,且相遇第一點為環入口點。程式描述如下:

*/listnode* findloopport(listnode* head)

if(fast == null || fast->next==null)

slow = head;

while(slow != fast)

return slow;

}

判斷乙個單鏈表是否有環及環

判斷乙個單鏈表是否有環及環的鏈結點 蒙恩的罪人 給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?解法 1 對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩...

如何判斷乙個單鏈表是否有環

題目要求 給定乙個單鏈表的頭指標head,要求寫乙個函式判斷這個單鏈表是否是乙個有環單鏈表。單鏈表中的節點定義如下 struct listnode 方法1 首先定義乙個mapmap,然後從單鏈表的頭指標開始往後遍歷,每次遇到乙個指標p,就判斷map pcur 是否為0,若為0,則將map pcur ...

判斷乙個單鏈表中是否有環

一 題目 判斷乙個單鏈表中是否存在環。二 解法 設定兩個工作指標slow和fast,初始值都指向群頭節點,slow每次前進一步,fast每次前進兩步,如果鍊錶中存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fast遍歷到null,則為無環鏈表 這樣就可以判斷兩個鍊錶是否...