判斷鍊錶是否有環

2021-06-26 09:24:35 字數 1104 閱讀 9579

單向鍊錶是最常用的資料結構之一,因此總結其常見的問題及其解決方案是很有意義的。

問題1:如何判斷乙個單向鍊錶是否有環?如果有,如何找到其入口節點的指標?

演算法思想:用兩個指標p1,p2同時指向鍊錶的頭部,p1一次移動一步,p2一次移動兩步,如果最終p1和p2重合則說明鍊錶有環,如果p2走到空指標(鍊錶的結尾)則說明鍊錶無環; 如果最終p1和p2重合,使p2重新指向鍊錶的頭結點,然後p1和p2同時一次移動一步,當p1和p2再次重合時該節點指標就是環的入口節點指標。

演算法實現:

[cpp]view plain

copy

print?

struct

node    

;    

/*判斷鍊錶是否有環,如果有環則返回環的首結點指標,否則返回null值*/

node* findcircle(node *head)    

else

return

null;    

}    

while

(p1!=p2);    

/*求出環的起點節點,並將其返回*/

p2=head;    

while

(p1!=p2)    

return

p1;           

}    

問題2:假定兩個單向鍊錶均無環。如何判定該兩個鍊錶相交?如果相交,如何找到首個相交點的指標?

演算法思想:判斷兩個單向鍊錶是否相交,有兩個方法:一是利用其充要條件,即,相交的充要條件是兩個鍊錶最後乙個表元為同一表元;二是將第二個鍊錶接在第乙個鍊錶後面,然後判斷第乙個鍊錶是否有環,如果有,則他們必然相交,否則不相交。   如何找到相交的首個節點呢?其實也就是第乙個鍊錶的環的入口節點。

演算法實現:

[cpp]view plain

copy

print?

struct

node    

;    

/*判斷兩個鍊錶是否交叉,如果交叉返回交叉節點,否則返回null。*/

node* findcross(node* head1,node* head2)    

如何判斷鍊錶是否有環 鍊錶是否有環的判斷

對於鍊錶是否存在環,有三個問題需要考慮 1.是否有環 2.入環節點 3.環的長度 第一種方法快慢指標法,也稱之為龜兔演算法,設定兩個指標,慢指標和快指標。最開始均指向鍊錶的頭節點,之後,快指標每次後移兩個節點,慢指標每次後移乙個節點。1.如果快指標指向空,則鍊錶無環 2.若快指標和慢指標再次指向乙個...

判斷鍊錶是否有環

1.如何判斷是否有環?如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。2.如何計算環的長度?第一次相遇 超一圈 時開始計數,第二次相遇時停止計數。3.如何判斷環的入口點 碰撞點p到連線點的距離 頭指標到連線點的距離,因此,分別從碰撞點 頭指標開始走,相遇的...

判斷鍊錶是否有環

給定乙個單鏈表,只給出頭指標h 解法 使用兩個slow,fast指標從頭開始掃瞄鍊錶。指標slow 每次走1步,指標fast每次走2步。如果存在環,則指標slow fast會相遇 如果不存在環,指標fast遇到null退出。public class linklistutli public stati...