單鏈表帶環問題

2021-08-08 15:45:32 字數 1466 閱讀 2684

判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?

1 2 3 4 5 6 7 8 9

不帶環:

鍊錶遍歷一次, 到最後的節點的下乙個節點會指向null,此時鍊錶不帶環。

帶環:,在判斷鍊錶是否帶環之前,應該先判斷鍊錶是否為空。空鍊錶肯定不帶環。只要鍊錶帶環,對鍊錶進行遍歷就會形成死迴圈,沒有出口。這是就需要用到快慢指標來確定鍊錶是否帶環。

定義兩個指標(fast,和slow)同時指向鍊錶的頭節點。 fast每次走兩步,slow每次走一步。(這裡最好是快的比慢的多走一步,如果多了的話可能會出現問題。具體看例子。)這樣的話,在進入slow進入環之後,fast肯定會在環內追上slow,如果fast追上了slow,那麼就說明這個鍊錶帶環。

舉個栗子:

假設有乙個帶環鍊錶,1 2 3 4 5 6 7 8 9   環的入口為7,slow=slow-next;fast=fast->next->next->next; 這樣的話進環之後,每次都會將fast和slow的位置互換,永遠也追不上。形成死迴圈。

求環的長度:

在此之前,我們已經知道了fast和slow的相遇點。定義乙個指標meet ,定義乙個計數器count。來記錄這個相遇點,然後slow指標再繼續遍歷每次count++。直到遇到指標meet,此時的count就是環的長度。

求環的入口點。

同樣,我們已經知道了相遇點,如何求入口點呢。重新定義乙個指標指向頭結點。然後每次指向下乙個節點。同時。定義乙個指標指向相遇點,每次指向下乙個節點。當兩個指標相遇時,就是環的入口點。

為什麼呢?

設頭結點到入口點的距離為a,入口點到相遇點的距離為c,相遇點到入口點的距離為c, 那麼就有 2*(a+c)=a+nb+c;注意一定是nb,而不是b,加入鍊錶很長,而環很短,那麼指標從相遇點走過的路程就會是nb。

2*(a+c)=a+nb+c;      a+c=nb, a=nb-c;

而a是環的頭結點到入口的距離。

判斷兩個鍊錶是否相交,若相交,求交點

第一種,不帶環

迴圈巢狀,設定兩個指標list1和list2分別指向兩個鍊錶的頭結點。然後遍歷,當兩個指標的next指標指向同乙個節點時說明兩個鍊錶相交。否則不想交。

第二種,帶環

帶環鍊錶判斷相交問題比較複雜,可以分為下面幾種情況:

1)相交點在環外;

注意:如果相交,那麼兩個鍊錶都帶壞。因為單鏈表相交點不會有兩個分別指向不同節點的next指標;

2)相交點在環的入口;

3)相交點在環內;

這種情況需要特別注意,相交點和入口點可以看作有兩種情況,分別作為入口點或者相交點。

4)兩個鍊錶都帶環但不想交;

當兩個鍊錶第二次走到環的入口處時,兩個鍊錶沒有相交點。

5)乙個鍊錶帶環乙個不帶環且不相交。

遍歷兩個鍊錶後沒有某乙個節點的next指向同乙個節點。

有關單鏈表帶環的問題

1.檢查鍊錶是否帶環,若帶求長度,環入口點。設定兩個快慢指標開始時指向起始位置,開始出發,如果這兩個指標相交,那麼存在環 從交點出發,當再次回到此點便可統計環長度 對與於環入口點,假設快指標每次走兩個位置,慢一直走乙個,如圖所示 則只需乙個從起始點,乙個從交點移動,必會相交。2.檢查兩煉表否相交 鍊...

面試題 單鏈表帶環問題

關於單鏈表帶環問題 1 怎樣判斷乙個單鏈表是否帶環 2 如果帶環,環的長度怎麼計算 3 如果帶環,怎麼求環的入口 1 怎樣判斷乙個單鏈表是否帶環 我們知道,單鏈表如果帶環,那麼從煉表頭開始遍歷就會進入死迴圈。其實我們可以用上篇部落格中提到的兩個指標移動的思想來求解,在這裡可以讓兩個指標移動速度不同,...

一 單鏈表 帶環單鏈表的詳細講解

今天看了一篇關於帶環單鏈表精講的文章,在這裡給大家做乙個總結。之前看過很多有關單鏈表帶環的文章,但是有些文章講的太文章化,不容易理解,理論性太強。接下來我會用最簡單通俗易懂的語言解析這個問題。當你拿到乙個單鏈表的資料資訊時,我相信大部分的人都會選擇去判斷一下這個單鏈表是否有環?這也是最基本的反應。下...