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;
};