題目:乙個鍊錶中包含環,如何找出環的入口結點?
首先,如果判斷乙個鍊錶有環?
設定兩個指標,乙個指標一次走一步,乙個指標一次走兩步,如果鍊錶有環,那麼兩個指標一定會相遇,而且是在環內相遇。
求環的入口結點:設定p1和p2兩個指標指向頭結點,如果環中有n個結點,指標p1現在鍊錶上移動n步然後兩個指標以相同的速度向前移動,當第二個指標指向環的入口點時,第乙個指標已經圍繞著環走了一圈,又回到了入口結點,即它們相遇的時候就是環的入口結點。
求環中結點個數:判斷乙個鍊錶是否有環的時候,使用一快一慢兩個指標,如果兩個指標相遇則表明鍊錶有環,兩個指標相遇的結點一定是在環中,可以從這個結點出發,一邊繼續向前移動一邊計數,當再次回到這個結點時,就可以得到環中結點數。
struct listnode
;//如果鍊錶有環,找到一快一慢兩個指標相遇的乙個結點
listnode* meetingnode(listnode* phead)
return null;
}listnode * entrynodeofloop(listnode * phead)
node1=phead;//第乙個指標指向頭結點
listnode* node2=phead;//第二個指標也指向頭結點
//先將node1走nodesinloop步
for(int i=0;inext;
} //兩個指標同時走,相遇的時候就是入口結點
while(node1!=node2)
return node1;
}
延伸:判斷兩個鍊錶是否相交:
1.當兩個鍊錶都沒有環的時候,如果兩個鍊錶相交,那麼尾結點一定相同,判斷它們的尾結點是否相同。
2.乙個鍊錶有環,另乙個鍊錶無環,則它們一定不相交。
3.當兩個鍊錶都有環的時候,兩個鍊錶環的入口結點為p1和p2
1)如果p1=p2一定相交
2)p1不等於p2
(1)p1不等於p2,判斷它們是否在乙個換,從p1開始向後遍歷看是否能達到p2,如果能達到說明在乙個環中,兩個鍊錶相交
(2)p1不等於p2,並且不在乙個環,兩個鍊錶不想交。
面試題56 鍊錶中環的入口節點
題目 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。這道題借助於前面的鍊錶的倒數第k個節點的思想,考慮快慢指標。考慮當知道了鍊錶的環中所含的節點數目,用乙個快指標先走這麼多個節點,再用慢指標,兩個同時走,此時他們相遇的第乙個節點就是鍊錶的入口節點。下面問題就轉換為求鍊錶環的節點數目。考慮鍊錶是否成環...
面試題23 鍊錶中環的入口結點
題目 如果乙個鍊錶中包含環,如何找出環的入口結點?例如 在圖3.8所示的鍊錶中,環的入口結點就是結點3.確定是否包含環 設定兩個指標,乙個快指標 每次移動兩步 乙個慢指標 每次移動一步 如果快指標追上了慢指標,那麼鍊錶包含環 如果快指標走到了鍊錶末尾 即node next null 都沒有追上慢指標...
(劍指Offer)面試題56 鍊錶中環的入口結點
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。1 雜湊表 遍歷整個鍊錶,並將鍊錶結點存入雜湊表中 這裡我們使用容器set 如果遍歷到某個鍊錶結點已經在set中,那麼該點即為環的入口結點 2 兩個指標 如果鍊錶存在環,那麼計算出環的長度n,然後準備兩個指標pslow,pfast,pfast先走n步,然...