以下为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),但是因为需要额外的空间存储标记或哈希表,所以不如快慢指针方法。