javascript - 编写一个函数来检测链表中的循环(Floyd's alg)...逻辑看起来正确,但找不到错误

标签 javascript linked-list floyd-cycle-finding cycle-detection

我正在尝试检测我创建的链接列表中的循环(我正在练习面试问题)。我理解弗洛伊德龟兔赛跑算法中涉及的逻辑,但该函数总是返回 false...

这是我的链接列表:

class LinkedList {
  constructor() {
    this.length = 0;
    this.head = null;
  }
  insert(index, value) {
    if (index < 0 || index > this.length) {
       throw new Error("Index error");
    }
    const newNode = {
       value
    };
    if (index == 0) {
      newNode.next = this.head;
      this.head = newNode;
    } else {
      const node = this._find(index - 1);
      newNode.next = node.next;
      node.next = newNode;
    }
    this.length++;
  }
  ...
}

//Inserting values
const linkedList = new LinkedList();
linkedList.insert(0, 12);
linkedList.insert(1, 24);
linkedList.insert(2, 65);
linkedList.insert(3, 23);
linkedList.insert(4, 9);
linkedList.insert(5, 7);
linkedList.insert(6, 13);
linkedList.insert(7, 65);
linkedList.insert(8, 20);

这是我的循环检测函数,即使存在循环它也会返回 false:

 function containsCycle(firstNode) {
   // Start both at beginning
   let slow = firstNode;
   let fast = firstNode;
   // Until end of the list
   while (fast && fast.next) {
     slow = slow.next;
     fast = fast.next.next;
   // fast is about to "lap" slow
     if (fast === slow) {
       return true;
     }
    }
   // fast hit the end of the list
   return false;
 }

//Calling function
containsCycle(linkedList.head);

我只是找不到我的功能出了什么问题,而且我越想弄清楚,我的思想就越狭隘......任何指导将非常感激!

最佳答案

每次插入时您都会创建新节点。例如。第三个和第八个节点的值都是 65,但不相等(它们是不同的对象,因此 === 条件将失败)。更重要的是,它们具有不同的 .next 节点,并且您的 slwofast 迭代器在遍历第 8 个元素后不会循环回第 4 个元素。

关于javascript - 编写一个函数来检测链表中的循环(Floyd's alg)...逻辑看起来正确,但找不到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55817200/

相关文章:

c++ - 单链表 C++

模仿 vector 的 C++ 链表

algorithm - 解释在循环链表中查找循环起始节点是如何工作的?

algorithm - 为什么在链表中查找循环时将指针增加 2,为什么不增加 3、4、5?

javascript - 从哪里下载 ui.jqgrid-bootstrap.css?

javascript - 如何以编程方式将所需的行移动到数据表的顶部?

javascript - Dreamweaver 缩小插件

javascript - 事件处理程序的性能是否取决于子元素的数量

java - 链表在位置添加

algorithm - 仅在 Floyd 循环查找算法中将快速指针增加 2