鍊錶環判定問題

2021-09-14 08:08:22 字數 734 閱讀 3965

今天,推薦**《絲綢之路》--喜多郎

使用兩個指標p和q,p=q=head;

如果q->next非null,q=q->next->next;如果p非null,p=p->next;

迴圈步驟2,直至p==q;

如果p、q均非null,則存在環,否則無環。

即q指標每次移動兩個元素,p每次移動乙個元素,當q追上p則存在環。

將上個問題p和q的相遇點記為join。

length=0 p=join,q=join;

如果p!=q, p=join,q=join->next->next,length++;

重複步驟2至p=q;

legth即為環的長度。

原理:當q追上p的時候,必定是p移動了一圈,q移動了兩圈;p的位移即環的長度。

連線點:即最後乙個元素的next指向的節點(如上圖的第二個節點)。

結論:頭結點到連線點的距離=連線點到join的距離。分別從join、頭指標開始走,每次走一步,相遇的那個點就是連線點。

從問題二知道環的長度a;

從為題三知道連線點。從head開始,遍歷到連線點,得到head到連線點的長度b。

鍊錶長度=a+b-1

判定鍊錶是否有環

class listnode 鍊錶節點定義 public boolean existcircle listnode head 判定鍊錶是否有環 public listnode findjoint listnode head 查詢連線點 return p 找到連線點 return null 不存在連線...

鍊錶環問題

給定乙個鍊錶,判斷該鍊錶中是否有環?如果有的話,環的長度是多少?環的入口是哪個節點?使用快慢指標策略,兩個指標都從頭指標出發,快指標每次走兩步,慢指標每次走一步。1.判斷鍊錶是否有環?如果快慢節點相遇,那麼鍊錶有環。2.如果有環,環的長度是多少?快慢指標相遇後,固定其中乙個指標 如快指標 不動,另乙...

鍊錶 鍊錶環問題總結

給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?1 如何判斷是否存在環?對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fast遇到n...