判斷鍊錶是否有環 三種思路

2021-10-04 08:48:32 字數 1102 閱讀 5303

給定乙個鍊錶,判斷鍊錶中是否有環。

注:這個環可以是尾節點連線到前面的任意乙個節點

最容易想到的,就是每遇到乙個節點,如果不存在,就把它存入雜湊表,存在就直接返回true。沒有乙個重複的就返回false

注意:

優劣勢分析:這是乙個常識,如果在乙個環形跑道上賽跑,快的人和慢的人一定會相遇。所以我們可以使用乙個快指標,每次走兩步,乙個慢指標,每次走一步,如果存在環,一定會相遇,如果快指標遇到空了,就說明沒有環。

注意:

優劣勢分析:

附加:如果需要返回成環的那個節點,我們只需要找到快慢指標相遇的點,用指標p代替,然後再用乙個指標指向頭指標,用q代替,每次同時將它們挪動一步,直到它們相遇,它們相遇的點就是環的入口!這裡省略數學證明,這其實也是floyd演算法的一種應用。

我們可以給每個訪問過變數記上乙個標記,如果下次仍然發現了這個標記,說明肯定成環。

常見的標價法是改變自身的值,通常為乙個大數,表示一般不可能取到的值,當然,這種方法嚴格意義上說是不嚴謹的。

也可以把每個訪問過的節點指向head節點,意義是強行改變指標,也可以改變指標為某一位址,總之,只要能讓原先節點變得有標誌意義。

注意:

優劣勢分析:

bool

hascycle

(listnode *head)

return

false

;}

bool

hascycle

(listnode *head)

return

true

;}

bool

hascycle

(listnode *head)

return

false

;}

atfwus --writing by 2020–03–24

如何判斷鍊錶是否有環 鍊錶是否有環的判斷

對於鍊錶是否存在環,有三個問題需要考慮 1.是否有環 2.入環節點 3.環的長度 第一種方法快慢指標法,也稱之為龜兔演算法,設定兩個指標,慢指標和快指標。最開始均指向鍊錶的頭節點,之後,快指標每次後移兩個節點,慢指標每次後移乙個節點。1.如果快指標指向空,則鍊錶無環 2.若快指標和慢指標再次指向乙個...

判斷鍊錶是否有環

1.如何判斷是否有環?如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。2.如何計算環的長度?第一次相遇 超一圈 時開始計數,第二次相遇時停止計數。3.如何判斷環的入口點 碰撞點p到連線點的距離 頭指標到連線點的距離,因此,分別從碰撞點 頭指標開始走,相遇的...

判斷鍊錶是否有環

單向鍊錶是最常用的資料結構之一,因此總結其常見的問題及其解決方案是很有意義的。問題1 如何判斷乙個單向鍊錶是否有環?如果有,如何找到其入口節點的指標?演算法思想 用兩個指標p1,p2同時指向鍊錶的頭部,p1一次移動一步,p2一次移動兩步,如果最終p1和p2重合則說明鍊錶有環,如果p2走到空指標 鍊錶...