直接遍歷整個鍊錶,檢視鍊錶是否存在重複結點。如果存在重複結點,則該鍊錶存在環。
如果可以更改鍊錶的域,則在其中增加"visit"域,初始值為0。如果訪問過該結點,則將其"visit"域更改為1。在檢視下乙個結點時,首先訪問其「visit」域,如果其域為0,則將其「visit」域更改為1,繼續遍歷;如果其域為1,則說明該鍊錶存在環。
如果無法更改鍊錶的域,則可以設定乙個陣列,將訪問過的結點的值記錄在陣列中。在訪問結點時,首先判斷是否存在在該陣列中。如果不存在,則將其值記錄在該陣列中;如果存在,則該鍊錶存在環。
選用兩個不同速度的指標遍歷該鍊錶。如果後續兩個指標相遇在同乙個結點中,則說明該鍊錶存在環。
原因:為什麼fast 走兩個節點,slow走乙個節點,有環的話,一定會在環內相遇呢,而不是永遠的錯開呢?
首先第一點: fast指標一定先進入環中,如果fast 指標和slow指標相遇的話,一定是在環中相遇,這是毋庸置疑的。
那麼來看一下,為什麼fast指標和slow指標一定會相遇呢?
這是因為fast是走兩步,slow是走一步,其實相對於slow來說,fast是乙個節點乙個節點的靠近slow的,所以fast一定可以和slow重合。
ps:尋找鍊錶的中間結點方法:
選用乙個前進速度為1個結點的指標,乙個前進速度為2個結點的指標。當後者找到了鍊錶結尾處,則前者正好在鍊錶中間處。
鍊錶是否存在環
鍊錶環的問題有兩種,一種是判斷是否存在環,另一種是在有的基礎上返回入環的第乙個節點。簡單思路 1 遍歷鍊錶,如果遇到空,那麼肯定無環。2 在遍歷的過程中,每個節點都加入到雜湊表中,加入前判斷是否存在,如果存在的話那麼就有環,而且第乙個判斷存在的節點就是入環的第乙個節點。總結 這個比較簡單,既可以做到...
判斷單向鍊錶中是否存在環
程式設計思路 追趕問題 在同一圓環上,當兩個物體以不同的速度前進時,他們總能在某個時間點上再次相遇 即當兩個指標以不同的移動速度在乙個單向鍊錶上移動時,若該鍊錶有環的存在,則這兩個指標總會在某一時刻同時指向鍊錶上的同乙個節點 include struct hasring bool ishasring...
如何判斷鍊錶是否有環 鍊錶是否有環的判斷
對於鍊錶是否存在環,有三個問題需要考慮 1.是否有環 2.入環節點 3.環的長度 第一種方法快慢指標法,也稱之為龜兔演算法,設定兩個指標,慢指標和快指標。最開始均指向鍊錶的頭節點,之後,快指標每次後移兩個節點,慢指標每次後移乙個節點。1.如果快指標指向空,則鍊錶無環 2.若快指標和慢指標再次指向乙個...