鍊錶是否存在環

2021-08-21 05:21:53 字數 783 閱讀 7482

鍊錶環的問題有兩種,一種是判斷是否存在環,另一種是在有的基礎上返回入環的第乙個節點。

簡單思路:

1、遍歷鍊錶,如果遇到空,那麼肯定無環。

2、在遍歷的過程中,每個節點都加入到雜湊表中,加入前判斷是否存在,如果存在的話那麼就有環,而且第乙個判斷存在的節點就是入環的第乙個節點。

總結:這個比較簡單,既可以做到第一種問題,也可以做到第二種問題。但是用到了額外空間。

下面說一下另乙個思路,使用快慢指標。針對兩個問題分別討論,基本上思路都是一致的。

問題一:

思路:1、遍歷鍊錶,如果遇到空,那麼肯定無環。

2、在遍歷過程中,如果快慢指標相遇那麼就存在環。

總結:如果沒有環肯定會因為第乙個條件終止,有環就會滿足第二個條件。

class solution 

listnode* f = head;

listnode* s = head;

while( (f != null) && (f->next != null) )

}return false;

}};

問題二:

思路:和問題一相同,在問題一的基礎上,如果發現有環那麼快指標回到頭結點,快指標變為一次走一步,再次和慢指標相遇的時候快慢指標都指向了入環的第乙個節點。

class solution   

}if( exist )

return fast;

}

return null;

}};

演算法 檢測是否鍊錶存在環

這兒例子使用快慢指標的辦法實現。h lengthx e m e m lengthy m e lengthz length of circle lengthy lengthz 假定1.開始點是h,環的進入點是e,快指標和慢指標首次相遇的點是m.2.慢指標和快指標首次相遇在m點的時候,是慢指標首次到達m...

如何判斷鍊錶是否存在環?

直接遍歷整個鍊錶,檢視鍊錶是否存在重複結點。如果存在重複結點,則該鍊錶存在環。如果可以更改鍊錶的域,則在其中增加 visit 域,初始值為0。如果訪問過該結點,則將其 visit 域更改為1。在檢視下乙個結點時,首先訪問其 visit 域,如果其域為0,則將其 visit 域更改為1,繼續遍歷 如果...

判斷單向鍊錶中是否存在環

程式設計思路 追趕問題 在同一圓環上,當兩個物體以不同的速度前進時,他們總能在某個時間點上再次相遇 即當兩個指標以不同的移動速度在乙個單向鍊錶上移動時,若該鍊錶有環的存在,則這兩個指標總會在某一時刻同時指向鍊錶上的同乙個節點 include struct hasring bool ishasring...