题目描述:给定一个链表,判断链表中是否有环。
Floyd 判圈算法类似龟兔赛跑,需要用到快指针 fast 和慢指针 slow。算法流程是:
代码实现如下:
// ac地址:https://leetcode-cn.com/problems/linked-list-cycle/
// 原文地址:https://xxoo521.com/2020-03-03-linked-list-cycle/
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
let slow = head;
let fast = head;
while (slow && fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
if (slow === fast) return true;
}
return false;
};
这种解法比较容易想到,使用哈希表来记录节点是否出现过。若存在环,那么一直向下访问,一定会回到环的入口处。
代码实现如下:
// ac地址:https://leetcode-cn.com/problems/linked-list-cycle/
// 原文地址:https://xxoo521.com/2020-03-03-linked-list-cycle/
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
if (!head) return false;
const map = new Map();
let node = head;
map.set(node, true);
while (node.next) {
if (map.get(node.next)) {
// map.clear() // 节省时间可以去掉
return true;
}
map.set(node.next, true);
node = node.next;
}
// map.clear()
return false;
};