面試題23 鍊錶中環的入口結點

2021-10-05 23:00:13 字數 1183 閱讀 6547

題目:如果乙個鍊錶中包含環,如何找出環的入口結點?例如:在圖3.8所示的鍊錶中,環的入口結點就是結點3.

確定是否包含環:設定兩個指標,乙個快指標(每次移動兩步),乙個慢指標(每次移動一步),如果快指標追上了慢指標,那麼鍊錶包含環;如果快指標走到了鍊錶末尾(即node->next==null)都沒有追上慢指標,那麼鍊錶就不包含環。

找到環的入口:設定兩個指標p1,p2;假設環有n個結點,指標p1先向前移動n步,然後兩指標以相同速度前進。當第二個指標指向換的入口結點時,第乙個指標已經圍繞環走了一圈,又回到了入口結點。

得到環中的結點個數:在2中得到相遇的結點(meetingnode)後,就可以從這個結點出發,一邊移動一邊計數,當再次回到這個結點時,就可以得到環中結點數了。

struct listnode;
在鍊錶中存在環的前提下找到快慢兩指標相遇的結點

listnode *meetingnode(listnode* head)

listnode *pslow=head->next;

if(pslow==null)return null;

listnode *pfast=pslow->next;

while(pslow!=null&&pfast!=null)

return null;

}

得到環的入口結點

listnode *entrynodeofloop(listnode* head)

//先移動p1

pnode1=head;

for(int i=1;i<=nodesinloop;i++)

//再移動p2

listnode* pnode2=head;

while(pnode1!=pnode2)

return pnode1;

}

面試題56 鍊錶中環的入口結點

題目 乙個鍊錶中包含環,如何找出環的入口結點?首先,如果判斷乙個鍊錶有環?設定兩個指標,乙個指標一次走一步,乙個指標一次走兩步,如果鍊錶有環,那麼兩個指標一定會相遇,而且是在環內相遇。求環的入口結點 設定p1和p2兩個指標指向頭結點,如果環中有n個結點,指標p1現在鍊錶上移動n步然後兩個指標以相同的...

面試題23 鍊錶中環的入口節點

面試題23 鍊錶中環的入口節點 題目 給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出 null 思路 定義快慢兩個指標,相遇後 環中相匯點 將快指標指向 phead 然後一起走,每次往後挪一位,相遇的節點即為所求。詳細分析 相遇即 p1 p2 時,p2 所經過節點數為 2x,p1 ...

面試題23 鍊錶中環的入口節點

一 判斷該鍊錶是否有環 使用雙指標,前指標走得快,後指標走得慢,如果有環,前指標能夠在後面追上慢指標 include struct listnode listnode meetingnode listnode phead return nullptr 二 找到環的入口 計算得到環的節點數 將指標1前...