如何判斷鍊錶中是否有環,若存在環,如何找到入口?
方法一:使用額外的空間
利用乙個map記錄已經存在的node, 當出現第二次即為存在環也是環的入口。
方法二:不使用額外的空間
先解決是否有環的問題,設定快慢指標,類別是跑步問題,在乙個環形跑道上跑快的總會追趕上慢的,那麼,如果存在環,快指標總會追上慢指標的。(在鍊錶問題中,使用快慢指標是乙個很重要的技巧)
下面是求環的入口問題:
假設單鏈表的總長度為l,頭結點到環入口的距離為a,環入口到快慢指標相遇的結點距離為x,環的長度為r,慢指標總共走了s步,則快指標走了2s步。另外,快指標要追上慢指標的話快指標至少要在環裡面轉了一圈多(假設轉了n圈加x的距離),得到以下關係
=nr因此可知最後一定相遇在環入口結點
public
class cyclelist
return node1;}}
return
null;}}
鍊錶環問題
給定乙個鍊錶,判斷該鍊錶中是否有環?如果有的話,環的長度是多少?環的入口是哪個節點?使用快慢指標策略,兩個指標都從頭指標出發,快指標每次走兩步,慢指標每次走一步。1.判斷鍊錶是否有環?如果快慢節點相遇,那麼鍊錶有環。2.如果有環,環的長度是多少?快慢指標相遇後,固定其中乙個指標 如快指標 不動,另乙...
鍊錶 鍊錶環問題總結
給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?1 如何判斷是否存在環?對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到n...
鍊錶有環問題
判斷乙個鍊錶是否有環 解析 如果鍊錶有環,則設定乙個指標,該指標會一直迴圈下去。我們可以設定兩個指標,乙個一次走一步,乙個一次走兩步,如果有環最終兩者會相遇,否則每次走兩步的指標最先走到鍊錶尾部。如下圖 延伸 判斷兩個鍊錶是否相交 給出兩個單向鍊錶的頭指標,比如l1,l2,判斷這倆個鍊錶是否相交。1...