如果乙個鍊錶中包含環,如何找出環的入口節點?
解決這個問題的第一步是如何確定乙個鍊錶中包含環。我們可以用兩個指標來解決這個問題。定義兩個指標,同時從鍊錶的頭節點出發,乙個指標一次走一步,另乙個指標一次走兩步。如果走得快的指標追上了走得慢的指標,那麼鍊錶就包含有環;如果走得快的指標走到了鍊錶的末尾都沒有追上第乙個指標,那麼鍊錶就不包含環。
第二步是如何找到環的入口。我們還是用兩個指標來解決這個問題。先定義兩個指標p1和p2指向鍊錶的頭節點。如果鍊錶中的環有n個節點,則指標p1先在鍊錶上向前移動n步,然後兩個指標以相同的速度向前移動。當第二個指標指向環的入口節點時,第乙個指標已經圍繞著環走了一圈,又回到了入口節點。
剩下的問題是如何得到環中節點的數目。我們在前面提到判斷乙個煉表裡是否有環時用到了一快一慢兩個指標。如果兩個指標相遇,則表明鍊錶中存在環。兩個指標相遇的節點一定是在環中。可以從這個節點出發,一邊繼續向前移動一邊計數,當再次回到這個節點時,就可以得到環中節點數了。
package section5_5;
public
class
solution
} listnode meetingnode
(listnode head)
listnode slow = head.next;
if(slow == null)
listnode fast = slow.next;
while
(fast != null && slow != null)
slow = slow.next;
fast = fast.next;
if(fast != null)
}return null;
} listnode entrynodeofloop
(listnode head)
int nodesinloop =1;
listnode node1 = meeting_node;
while
(node1.next != meeting_node)
node1 = head;
for(
int i =
0;i < nodesinloop;i++
) listnode node2 = head;
while
(node1 != node2)
return node1;
}//測試用例
public
static
void
main
(string[
] args)
node = head;
listnode cur1 = node;
while
(cur1.val !=3)
listnode cur2 = node;
while
(cur2.val !=6)
cur2.next = cur1;
solution solution =
newsolution()
; system.out.
println
(solution.
entrynodeofloop
(head)
.val);}
}
23 鍊錶中環的入口節點
1.從鍊錶開始節點處初始化兩個快 慢指標 乙個走兩步,乙個走一步。若重合則存在環形鍊錶 2.判斷重合節點是否為空或者重合節點是否為鍊錶的末尾節點,如果是環形鍊錶則不應該有末尾節點 next null表示鍊錶的末尾節點 3.乙個指標從頭節點開始,乙個指標從重合節點處開始,兩個指標以相同的速度開始走,直...
鍊錶中環的入口節點
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。思路 通過141題,我們知道可以通過快慢指標來判斷是否有環,現在我們假設兩個指標相遇在z點,如圖 那麼我們可以知道fast指標走過a b c b slow指標走過a b 那麼2 a b a b c b 所以a c 那麼此時讓slow回到起點,fast依然...
鍊錶中環的入口節點
題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。演算法描述 受之前的面試題的啟發,如果我們在乙個有環的鍊錶中設定兩個鍊錶指標,乙個快,乙個慢,那麼兩個鍊錶指標相遇的時候,必然是位於鍊錶中的某個結點,利用這個結點,當我們從這個結點開始繼續遍歷,當再一次回到這個結點的時候,我們可以統計出環中的結...