單向鍊錶判斷是否有環

2021-05-28 06:56:33 字數 926 閱讀 1849

如何最有效的檢查單向鍊錶中是否包含了環。請避免使用額外的記憶體。

先給出答案吧:

定義兩個指標。指標a從鍊錶開始處每次向後移動個節點。指標b從鍊錶開始處每次向後移動個節點。問題的關鍵是乙個單項鍊表中只可能有乙個環,並且指標一旦進入環中就無法離開。因此我們可以預期經過一段時間後,a剛好指向環的第乙個節點,而b指向環中的某個節點。

假設b和a的距離是k。因為b的速度比a要快乙個節點,所以移動k次之後兩個指標必定重合。此時即可認定鍊錶中包含乙個環。

時間複雜度小於o(n)

空間複雜度o(1)

這個演算法稱作floyd』s cycle-finding algorithm

實現如下:

struct linkedlist

struct linkedlist *iscycliclist(struct linkedlist *phead)

return pstart;

}補充:找出交點(環路的入口)及證明第一次相遇後,

接下來,讓p2回到鍊錶的頭部,重新走,每次步長不是走2了,而是走1,那麼當p1和p2再次

相遇的時候,就是環路的入口了。

這點可以證明的:

在p2和p1第一次相遇的時候,假定p1走了n步驟,環路的入口是在p步的時候經過的,那麼有

p1走的路徑: p+c = n; c為p1和p2相交點,距離環路入口的距離

p2走的路徑: p+c+k*l = 2*n; l為環路的周長,k是整數

顯然,如果從p+c點開始,p1再走n步驟的話,還可以回到p+c這個點

同時p2從頭開始走的話,經過n不,也會達到p+c這點

顯然在這個步驟當中p1和p2只有前p步驟走的路徑不同,所以當p1和p2再次重合的時候,必

然是在鍊錶的環路入口點上。

**:

判斷單向鍊錶是否有環

若單向鍊錶存在環那麼鍊錶的形態為 有環的鍊錶簡單的遍歷走不到尾 那麼我們怎麼判斷有環呢?環就像是操場的的跑到 那麼運動天賦一向不太好的 我很容易就能想到跑步時容易讓人扣圈 同理 我們可以定義兩個指標讓他們同時指向鍊錶的頭 乙個指標一次走兩步 乙個指標一次走一步 那麼如果鍊錶有環那麼他們一定會在環內的...

判斷單向鍊錶是否有環

找出環的入口點 求環的長度 求環上距離任意一點最遠的點 判斷兩個無環鏈表是否相交 判斷相交的位置 給乙個單鏈表,判斷其中是否有環的存在 如果存在環,找出環的入口點 如果存在環,求出環上節點的個數 如果存在環,求出鍊錶的長度 如果存在環,求出環上距離任意乙個節點最遠的點 對面節點 如何判斷兩個無環鏈表...

如何判斷單向鍊錶中是否有環

首先遍歷鍊錶,尋找是否有相同位址,藉此判斷鍊錶中是否有環 如果不考慮空間複雜度,可以使用乙個map記錄走過的節點,當遇到第乙個在map中存在的節點時,就說明回到了出發點,即鍊錶有環,同時也找到了環的入口。如果程式進入死迴圈,則需要一塊空間來儲存指標,遍歷新指標時將其和儲存的舊指標比對,若有相同指標,...