帶環的鍊錶

2021-06-19 19:29:00 字數 620 閱讀 8274

帶環的鍊錶

wronsky

單鏈表的問題在面試考試等等等等中頻頻上鏡,大有趕上鳳姐超越芙蓉之勢。假若有乙個蛋疼的程式猿把單鏈表的末尾結點的next指標指向了單鏈表中乙個隨機的結點上,那麼我們經常寫的乙個迴圈while(p)或者while(p->next)就可以父傳子子傳孫子子孫孫無窮盡了。

話說怎麼判斷單鏈表是否帶環了呢?大部分人都知道了:讓快指標追慢指標,追上了就有環,快指標走到頭了,就無環。

那麼又如何判斷那個dt的程式猿把尾結點的next指標指向何處或者說環的入口在哪呢?也許下面的推導只是小學初中級的數學知識,但是大多數人(包括我在內)都沒有想到過這麼玄而又玄的問題可以用這麼簡單的數學理論來解答:

假設單鏈表的總長度為l,頭結點到環入口的距離為a,環入口到快慢指標相遇的結點距離為x,環的長度為r,慢指標總共走了s步,則快指標走了2s步。另外,快指標要追上慢指標的話快指標至少要在環裡面轉了一圈多(假設轉了n圈加x的距離),得到以下關係:

s = a + x;

2s = a + nr + x;

=>a + x = nr;

=>a = nr - x;

由上式可知:若在頭結點和相遇結點分別設一指標,同步(單步)前進,則最後一定相遇在環入口結點,搞掂!

附圖:

LintCode 帶環鍊錶

給定乙個鍊錶,判斷它是否有環。參考了網上一些資料,算是乙個總結。感謝sunflower yolanda的文章。由這個問題可以引申出來幾個問題,先解決本身。1.判斷是否有環。利用兩個指標slow fast。初始時,兩個指標都在表頭。slow每次走一步,fast每次走兩步。如果不存在環,那麼fast一定...

102 帶環鍊錶

帶環鍊錶得幾個問題 判斷乙個鍊錶是否有環,如果有環,則返回入環的第乙個節點,否則返回null 如果乙個鍊錶有環,遍歷乙個鍊錶便永遠不會到達null,否則必定會到達null。設定兩個指標,剛開始都指向頭節點,遍歷時,乙個指標每次前進一步,我們稱之為慢指標,另乙個每次前進兩步,稱之為快指標,這樣,如果鍊...

判斷鍊錶是否帶環

有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進...