同步發佈於 Github repo
Given a linked list, determine if it has a cycle in it.
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
const hasCycle = head => {
if(head === null || head.next === null) {
return false;
}
let fast = head.next;
let slow = head;
while(fast !== slow) {
if(fast === null || fast.next === null) {
return false;
}
fast = fast.next.next;
slow = slow.next;
}
return true;
};
今天是第十天,又要進入下一個主題囉~
這次的主題是 Linked List
, Linked List
是個能快速方便地動態新增和刪除的資料結構,與陣列不同的是, Linked List
的元素在記憶體中是不連續的,而陣列是連續的,
每個節點(node)都是由一個資料(data)和一個指向下一個節點的指標(next pointer)組成,
在 JavaScript
中, Linked List
通常是以 class
或 function
實作的。
今天的題目很簡單,難度只有 Easy
,
題意很言簡意賅,給一個 Linked List
,然後確認有沒有 cycle
在裡面,
我們使用 雙指標追擊法
來解決這題,詳細步驟將在下面說明~
fast
一次走兩步,slow
一次走一步, fast
永遠會追擊著慢指針 slow
,cycle
的話, fast
會追上 slow
,fast = head.next;
slow = head;
。let fast = head.next;
let slow = head;
Linked List
沒有 cycle
的話,那 fast
會遇到 null
, return false
。Linked List
有 cycle
的話,那 fast
一定會遇到 slow
,並且 fast
已經超過 slow
一整圈, return true
。while(fast !== slow) {
if(fast === null || fast.next === null) {
return false;
}
fast = fast.next.next;
slow = slow.next;
}
return true;