單向鍊錶是最常用的資料結構之一,因此總結其常見的問題及其解決方案是很有意義的。
問題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...