[路飞]_判断是否是环形链表

208 阅读1分钟

1. 判断是否是环形链表

给定一个链表,判断链表中是否有环。

image.png

1.1 借助哈希表

解题思路:

  • 哈希表存遍历过的节点,每遍历一个节点,都查看哈希表是否存在当前节点,如果存在,则说明链表有环
  • 如果不存在,则存入哈希表,继续遍历

代码实现如下:

var hasCycle = (head) => {
  let map = new Map();
  while (head) {
    if (map.has(head)) return true;
    map.set(head, true); // 存的是节点的地址引用,而不是节点值
    head = head.next;
  }
  return false;
};

1.2 快慢指针法

解题思路:

  • 使用追击问题的思路

两个人在跑道上赛跑,同一个起点出发,一个跑得快一个跑得慢,在某一时刻,跑得快追上跑的慢的,说明跑道上出现环形赛道了,如果没有环形赛道,则快慢两人永远不会相遇

  • 一个快指针与一个慢指针同事从头部出发,慢指针走一格,快指针走两格
  • 如果出现快慢指针相同时,则有环

代码实现如下:

var hasCycle = function(head) {
    //如果head节点为无直接无环
    if(!head) return false
    //慢的为pre,快的为cur
    var pre = head, cur = head
    //如果有快的且快的下一步有一直循环
    while(cur && cur.next) {
        pre = pre.next
        cur = cur.next.next
        if(pre === cur) return true
    }
  return false;
};