今天,推薦**《絲綢之路》--喜多郎
使用兩個指標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...