題目描述:
如果有乙個單向鍊錶,鍊錶當中有可能出現"環",就像下圖這樣,如何判斷這個鍊錶是有環鏈表?
方案一:暴力法
從頭節點,依次遍歷單鏈表的每乙個節點,每到乙個新的節點就頭節點重新遍歷之前的所有的節點,對比此時的節點,如果相同,證明該節點遍歷過兩次,以此說明鍊錶是有環的
偽**:
此方案時間複雜度為o(n^2),空間複雜度為o(1)node p = head.next
while(p.next!==null)
if(c.next!==p.next)
p = p.next
}return false
第二種方案:用hashmap快取遍歷的過的節點
還是頭節點進行遍歷,每一次遍歷新的節點時,對比儲存到hashmap集合是否有相同的節點,有,證明有環,無,儲存到集合中
偽**:
此方案的時間複雜度為o(n),空間複雜度為o(n)node p = head
hashmap hm = new hashmap()while(p!=null)
hm.put(p,p)
p =p.next
}
第三種方案:雙指標遍歷
首先建立兩個指標1和2,同時指向這個鍊錶的頭節點。然後開始乙個大迴圈,在迴圈體中,讓指標1每次向下移動乙個節點,讓指標2每次向下移動兩個節點,然後比較兩個指標指向的節點是否相同。如果相同,則判斷出煉表有環,如果不同,則繼續下一次迴圈
偽**:
此方案的時間複雜度為o(n),空間複雜度為o(1)node p = head
node q = head.next
while(p!==q)
return true
引申的問題:
問題一:判斷兩個單向鍊錶是否相交
解決思路:
將最後乙個節點的指向某個單向鍊錶的頭節點,根據之前的判斷是否有環的方法去判斷是否有環,有環則為相交,無環則不相交
問題二:找出乙個有環鏈表的入環點
解決思路:
**:
如何判斷鍊錶有環
假設存在環,環前共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...
如何判斷鍊錶有環
題目描述 有乙個單向鍊錶,鍊錶中有可能出現 環 如下圖,那麼,如何用程式來判斷該鍊錶是否為有環鏈表呢?方法一 從頭節點開始遍歷每乙個節點,每遍歷乙個新節點就從頭檢查到新節點之前的所有節點,如果和該新節點的值有重複,則證明該節點被遍歷過兩次,鍊錶有環 如果不存在與新節點相同值的節點,就繼續遍歷下乙個新...