如何判斷鍊錶是否有環

2021-07-16 00:18:39 字數 1151 閱讀 6561

背景 :

例如在乙個大的系統中,如果出現兩個鍊錶相交的情況,而且釋放其中乙個鍊錶所有的節點,那就會造成資訊的丟失, 並且釋放其中乙個鍊錶的所有節點,那就會造成資訊的丟失並且與之相交的鍊錶也會受到影響,

如下圖: 給出兩個單鏈表的頭指標 h1,h2

(假設兩個鍊錶均不帶環)

方法一:  判斷第乙個鍊錶所有的節點是否在第二個鍊錶中,這種方法時間複雜度為

o(h1)*o (h2)

方法二:利用計數的方法:

如果兩個鍊錶相交的話, 那麼兩個鍊錶就會有共同的節點,而節點位址有是又是節點的唯一標識,因此如果我們能夠判斷兩個鍊錶是否存在位址一致的節點就可以判斷兩個鍊錶是否相交,實現就是對對第乙個鍊錶的節點進行hash

排序,建立

hash

表,然後針對第二個鍊錶中的每乙個節點的位址查詢

hash

表, 如果其在

hash

表中出現,那麼說明第二個鍊錶和第乙個鍊錶有共同的節點。時間複雜度為

(max (length (h1)+length (h2)),

???(為何???)但是需要

o(length  (h1))

的空間, 這樣以空間換取時間。

方法三:由於兩個鍊錶都沒有環,可以把第二個鍊錶接在第乙個鍊錶的後面, 如果得到的鍊錶有環那麼說明兩個鍊錶相交,否則兩個來鍊錶不相交,這樣就將問題轉換為判斷乙個鍊錶是否有環的問題。如下:

在此判斷是否有環,如果存在環的話,則第二個鍊錶的表頭一定在環上,因此只需從第二個鍊錶開始遍歷,看是否回到起點就可以判斷出來, 最後,恢復原來狀態即可。

方法四:

如果兩個沒有環的鍊錶相交於一點的話, 那麼在這個節點之後的所有節點都是兩個鍊錶所共有的。因此 先遍歷乙個鍊錶記住最後乙個節點, 然後遍歷第二個節點到最後乙個節點的時候和第乙個鍊錶的最後乙個節點進行比較, 如果相同的,則相交, 否則不想交。時間複雜度為o (max length (h1) +length(h2)).

只需要乙個指標來儲存最後乙個節點。這個方法是上三個方法中最好的。

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

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

如何判斷鍊錶是否有環

這個問題可以衍生出很多擴充套件性的問題 給定乙個單鏈表,1.如何判斷是否有環 2.如何知道環的長度 3.如何找到環的入口 4.整個鍊錶的長度是多少 相應的解法如下 問題1時後面所有問題的根問題,解決這個問題一般用到快慢指標,乙個fast指標,乙個slow指標,兩個指標同時指向單鏈表的頭結點,然後fa...

如何判斷鍊錶中是否有環

今天面試被問住了,很慚愧啊,回來上網查了一下思路。自己寫了點程式。1.如何判斷是否有環?如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。2.如何計算環的長度?第一次相遇 超一圈 時開始計數,第二次相遇時停止計數。3.如何判斷環的入口點 碰撞點p到連線點的距...