鍊錶中環的入口節點

2021-09-22 18:45:18 字數 1455 閱讀 2985

題目描述:

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。

為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。

說明:不允許修改給定的鍊錶。

樣例:輸入:head = [3,2,0,-4], pos = 1

輸出:tail connects to node index 1

解釋:鍊錶中有乙個環,其尾部連線到第二個節點。

輸入:head = [1,2], pos = 0

輸出:tail connects to node index 0

解釋:鍊錶中有乙個環,其尾部連線到第乙個節點。

輸入:head = [1], pos = -1

輸出:no cycle

解釋:鍊錶中沒有環。

分析:首先如果證明鍊錶中有環可以定義兩個指標,乙個指標slow一次走一步,另乙個指標fast一次走兩步。如果走的快的指標追上了走的慢的指標,則證明鍊錶中有環。

如何找到環的入口節點呢?

定義兩個指標p1和p2,如果鍊錶中的環有n個節點,則指標p1先在鍊錶上移動n步,然後兩個指標以相同的速度向前移動,直到他們相遇,他們相遇的節點正好是環的入口節點。

如何得到環中的節點數目呢?

在證明鍊錶中是否存在環時用到了兩個指標,(乙個快指標,乙個慢指標),當兩個指標相遇時,則表明鍊錶中存在環。兩個指標相遇的節點一定是在環中。可以從這個節點出發,一邊繼續向前移動一邊計數,當再次回到這個節點時,即可得到環中節點的個數。

public listnode detectcycle(listnode head) 

listnode comm=slow;

int count=1;slow=slow.next;

while(slow!=comm)

slow=head;fast=head;

while(count!=0)

while(fast!=slow)

return slow;

}

如何找到第乙個入環節點?

令慢指標指向head.next 快指標執行head.next.next

當二者相遇時,重置fast=head,每次向前移動一步

再次相遇即為環的入口節點

public listnode detectcycle(listnode head) 

fast=head;

while(fast!=slow)

return fast;

}

鍊錶中環的入口節點

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。思路 通過141題,我們知道可以通過快慢指標來判斷是否有環,現在我們假設兩個指標相遇在z點,如圖 那麼我們可以知道fast指標走過a b c b slow指標走過a b 那麼2 a b a b c b 所以a c 那麼此時讓slow回到起點,fast依然...

鍊錶中環的入口節點

題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。演算法描述 受之前的面試題的啟發,如果我們在乙個有環的鍊錶中設定兩個鍊錶指標,乙個快,乙個慢,那麼兩個鍊錶指標相遇的時候,必然是位於鍊錶中的某個結點,利用這個結點,當我們從這個結點開始繼續遍歷,當再一次回到這個結點的時候,我們可以統計出環中的結...

鍊錶中環的入口節點

題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。解題思路 假設x為環前面的路程 黑色路程 a為環入口到相遇點的路程 藍色路程,假設順時針走 c為環的長度 藍色 橙色路程 第一步 找環中相匯點。分別用p1,p2指向鍊錶頭部,p1每次走一步,p2每次走二步,直到p1 p2找到在環中的相匯點。此時...