如何判斷鍊錶有環?

2021-09-16 12:28:26 字數 1305 閱讀 7252

題目描述:

如果有乙個單向鍊錶,鍊錶當中有可能出現"環",就像下圖這樣,如何判斷這個鍊錶是有環鏈表?

方案一:暴力法

從頭節點,依次遍歷單鏈表的每乙個節點,每到乙個新的節點就頭節點重新遍歷之前的所有的節點,對比此時的節點,如果相同,證明該節點遍歷過兩次,以此說明鍊錶是有環的

偽**:

node p = head.next

while(p.next!==null)

if(c.next!==p.next)

p = p.next

}return false

此方案時間複雜度為o(n^2),空間複雜度為o(1)

第二種方案:用hashmap快取遍歷的過的節點

還是頭節點進行遍歷,每一次遍歷新的節點時,對比儲存到hashmap集合是否有相同的節點,有,證明有環,無,儲存到集合中

偽**:

node p = head

hashmap hm = new hashmap()while(p!=null)

hm.put(p,p)

p =p.next

}

此方案的時間複雜度為o(n),空間複雜度為o(n)

第三種方案:雙指標遍歷

首先建立兩個指標1和2,同時指向這個鍊錶的頭節點。然後開始乙個大迴圈,在迴圈體中,讓指標1每次向下移動乙個節點,讓指標2每次向下移動兩個節點,然後比較兩個指標指向的節點是否相同。如果相同,則判斷出煉表有環,如果不同,則繼續下一次迴圈

偽**:

node p = head

node q = head.next

while(p!==q)

return true

此方案的時間複雜度為o(n),空間複雜度為o(1)

引申的問題:

問題一:判斷兩個單向鍊錶是否相交

解決思路:

將最後乙個節點的指向某個單向鍊錶的頭節點,根據之前的判斷是否有環的方法去判斷是否有環,有環則為相交,無環則不相交

問題二:找出乙個有環鏈表的入環點

解決思路:

**:

如何判斷鍊錶有環

假設存在環,環前共l個節點,環中共c個節點.設乙個慢指標起始位置為a,速度為1,快指標起始位置為b,速度為2.t時間後,二者相遇,可列方程 a t l mod c b 2 t l mod c 即t a b mod c 該模線性方程必定有解.所以無論a,b的起始位置如何,二者總是會相遇的.struct...

如何判斷鍊錶有環?

參考 程式設計師小灰 參考2 漫畫演算法 如何判斷鍊錶有環?package chapter5.part2 public class linkedlistcycletest else private static boolean iscycle node head return false priva...

如何判斷鍊錶有環

題目描述 有乙個單向鍊錶,鍊錶中有可能出現 環 如下圖,那麼,如何用程式來判斷該鍊錶是否為有環鏈表呢?方法一 從頭節點開始遍歷每乙個節點,每遍歷乙個新節點就從頭檢查到新節點之前的所有節點,如果和該新節點的值有重複,則證明該節點被遍歷過兩次,鍊錶有環 如果不存在與新節點相同值的節點,就繼續遍歷下乙個新...