判斷乙個鍊錶是否有環

2021-09-07 05:21:41 字數 1090 閱讀 3842

思路:如果開始有兩個指標指向頭結點,乙個走的快,乙個走的慢,如果有環的話,最終經過若干步,快的指標總會超過慢的指標一圈從而相遇。

如何計算環的長度呢?可以第一次相遇時開始計數,第二次相遇時停止計數。

如何判斷環的入口點?碰撞點p到連線點的距離=頭指標到連線點的距離,因此,分別從碰撞點、頭指標開始走,相遇的那個點就是連線點。

當fast與slow相遇時,show肯定沒有走完鍊錶,而fast已經在還裡走了n(n>= 1)圈。假設slow走了s步,那麼fast走了2s步。fast的步數還等於s走的加上環裡轉的n圈,所以

有:2s = s + nr。因此,s = nr。

設整個鍊錶長為l,入口據相遇點x,起點到入口的距離為a。因為slow指標並沒有走完一圈,所以:a + x = s,帶入第一步的結果,有:a + x =

nr = (n-1)r + r = (n-1)r + l - a;即:a = (n-1)r + l -a -x;

這說明:從頭結點到入口的距離,等於轉了(n-1)圈以後,相遇點到入口的距離。因此,我們可以在煉表頭、相遇點各設乙個指標,每次各走一步,兩個指標必定相遇,且相遇第一點為環入口點。

判斷是否有環

bool hascycle(listnode *head) 

return

false

; }

計算環的長度

int looplength(listnode *head)

//計數

if(begin == true

) ++length;

}return

length;

}

//求環的入口結點

listnode* findloopentrance(listnode *head)

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

return

null;

slow =head;

while(slow !=fast)

return

slow;

}

判斷乙個鍊錶是否有環

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...

判斷乙個鍊錶是否有環

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

判斷乙個鍊錶是否有環

乙個鍊錶如果是這樣部分有環的應該怎樣判斷 現在可以找出的是乙個鍊錶是否有環,而且可以找出環開始的那個點。假設有兩個學生a和b在跑道上跑步,兩人從相同起點出發,假設a的速度為2m s,b的速度為1m s,結果會發生什麼?答案很簡單,a繞了跑道一圈之後會追上b!class node public cla...