set 判重
利用節點的內存地址來進行判重
var hasCycle = function (head) {
let set = new Set();
let p = head;
while (p) {
//存在重復
if (set.has(p)) {
return true;
}
set.add(p);
p = p.next;
}
return false;
};
利用快慢指針
主要是利用的「Floyd 判圈算法」(又稱龜兔賽跑算法),首先慢指針每次移動一步,快指針移動2步,如果沒有環,那么慢指針永遠也追不上快指針。如果有環,那么快指針一定會遇到慢指針
var hasCycle = function (head) {
let fast = head,
slow = head;
// 零個結點或者一個結點,肯定無環
if (fast.next == null || fast.next.next == null) return false;
while (fast && fast.next) {
//走一步
slow = slow.next;
//走二步
fast = fast.next.next;
if (slow === fast) {
return true;
}
}
return false;
};