設計鏈表
一、LeetCode題解
瞧一瞧~
- 博健的LeetCode題解:Gitbook版本傳送門
- 博健的LeetCode題解:CSDN傳送門
- 前端進階筆記:Gitbook傳送門
二、算法題
題目
給定一個鏈表,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 null。如果有環,則確定它的入口位置。
思路
- 第一階段,我們先確定當前鏈表是否存在環
- 第二階段,如果存在環,我們要確定入口的位置
- 入口前節點個數爲
a
,環節點個數爲b
; - 快節點走過的節點數 = 2 * 慢節點走過的節點數,即
f = 2s
; - 快節點走過的節點數 = s + nb(多揍了n倍的環)(相遇時);
- 由此得出:
s = nb
(相遇時); - 如果說慢指針走到入口的距離 k =
a + nb
,兩點相遇時s = nb
,即再走a步即可; - 我們重新確定雙指針(速度要相同),新指針走
a
步應該到達入口,慢指針走a
步也會到達入口; - 新指針推斷爲 頭節點,兩者相遇的節點爲入口;
- 入口前節點個數爲
代碼
var detectCycle = function(head) {
var slow = head, fast = head;
while(fast && fast.next) {
// 如果 快指針 走到終點,證明無環
slow = slow.next;
fast = fast.next.next;
if (fast === slow) {
// 記錄相遇點
// 新指針在起點,快指針在相遇點
// 兩個節點再次相遇時,一定在入口點
var start = head;
while (start !== fast) {
start = start.next;
fast = fast.next;
}
return fast;
}
}
return null;
};