給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。
以下為分析過程為 左程雲 《程式設計師**面試指南 --it名企演算法與資料結構題目最優解》中的解析
如果乙個鍊錶沒有環,那麼遍歷鍊錶一定可以遇到鍊錶的終點;如果鍊錶中有環,那麼遍歷鍊錶就永遠在環裡轉下去了。如何找到第乙個入環結點,具體過程如下:設定乙個慢指標 slow 和乙個快指標 fast 。在開始時, slow 和 fast 都指向鍊錶的頭結點 head, 然後 slow 每次移動一步,fast 每次移動兩步,在鍊錶中遍歷。
如果鍊錶無環,那麼fast 指標在移動過程中一定先遇到終點,一旦 fast 到達終點,說明鍊錶中是 沒有環的,直接返回 null ,表示鍊錶無環,當然也沒有第乙個入環的結點。
如果鍊錶有環,那麼 fast 指標和 slow 指標一定會在環中的某個位置相遇, 當 fast 和 slow 相遇時, fast 指標重新回到 head 的位置,slow 指正不懂。接下來,fast 指標從每次移動兩步改為每次移動一步,slow 指標依然每次移動一步,然後繼續遍歷。
fast 指標和 slow 指標一定會再次相遇,並且在第一次入環的節點處相遇。
public listnode entrynodeofloop
(listnode phead)
listnode s = phead.next;
listnode f = phead.next.next;
while
(s != f)
s = s.next;
f = f.next.next;
} f = phead;
while
(s != f)
return s;
}
環形鍊錶2 找入環結點)
思路 針對這個題,需要分情況討論。有環存在和無環存在兩種情況。如何確定鍊錶是否帶環?可以利用快慢指標的思路 定義乙個快指標,乙個慢指標,初始位置都放在煉表表頭的位置,讓快指標每次走兩步,慢指標每次走一步,若快指標走到了null,則說明這個鍊錶沒有環。若快指標沒有走到null而且慢指標追上了快指標,此...
鍊錶環的入口結點
如果乙個鍊錶包含環,如何找出環的入口結點?單鏈表只有乙個指標域,所以環的話一定是後半部分成環或者是一整個。關於這種鍊錶問題,一般都是可以用雙指標來解決。首先考慮特殊情況,不是環 雙指標 鍊錶為none。1.通過pre和latter兩個指標,同時走,pre的速度是latter的兩倍,如果pre小於等於...
鍊錶的環的入口結點
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。struct listnode 資料快慢指標 判斷是否有環就不解釋了,下面主要解釋,為什麼可以那樣找環入口。a b c 只是個簡單圖,就不專門做圖了,湊合表示下吧。也就是a的位置是頭節點,b表示環入口處,c表示快慢指標第一次相遇處。在c處相遇時,設慢指標...