判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?
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 怎樣判斷乙個單鏈表是否帶環 我們知道,單鏈表如果帶環,那麼從煉表頭開始遍歷就會進入死迴圈。其實我們可以用上篇部落格中提到的兩個指標移動的思想來求解,在這裡可以讓兩個指標移動速度不同,...
一 單鏈表 帶環單鏈表的詳細講解
今天看了一篇關於帶環單鏈表精講的文章,在這裡給大家做乙個總結。之前看過很多有關單鏈表帶環的文章,但是有些文章講的太文章化,不容易理解,理論性太強。接下來我會用最簡單通俗易懂的語言解析這個問題。當你拿到乙個單鏈表的資料資訊時,我相信大部分的人都會選擇去判斷一下這個單鏈表是否有環?這也是最基本的反應。下...