以下为ChatGPT自动生成的解答,正确与否请自行判断。

BFE.devAI解答 - JavaScript 代码题
100. 检测链表中是否有环

方法一:快慢指针

使用快慢指针,快指针每次走两步,慢指针每次走一步,如果存在环,快指针一定会在某个时刻追上慢指针。

时间复杂度 O(n),空间复杂度 O(1)。

代码如下:

function hasCycle(head) {
  let fast = head;
  let slow = head;
  while (fast && fast.next) {
    fast = fast.next.next;
    slow = slow.next;
    if (fast === slow) {
      return true;
    }
  }
  return false;
}

方法二:标记法

使用一个标记变量标记每个节点是否被访问过,如果某个节点被重复访问,则说明存在环。

时间复杂度 O(n),空间复杂度 O(n)。

代码如下:

function hasCycle(head) {
  let curr = head;
  while (curr) {
    if (curr.visited) {
      return true;
    } else {
      curr.visited = true;
      curr = curr.next;
    }
  }
  return false;
}

方法三:哈希表

使用哈希表存储每个节点,如果某个节点被重复访问,则说明存在环。

时间复杂度 O(n),空间复杂度 O(n)。

代码如下:

function hasCycle(head) {
  const map = new Map();
  let curr = head;
  while (curr) {
    if (map.has(curr)) {
      return true;
    } else {
      map.set(curr, true);
      curr = curr.next;
    }
  }
  return false;
}

总结:

快慢指针是最优解,时间空间复杂度均最优。标记法和哈希表方法都是时间复杂度 O(n),空间复杂度 O(n),但是因为需要额外的空间存储标记或哈希表,所以不如快慢指针方法。