loops - 在单链接列表中检测循环的开始?

标签 loops linked-list find singly-linked-list cycle-detection

有什么方法可以使用不超过两个指针在链接列表中找出循环的起点吗?
我不想访问每个节点并标记为已看到并报告已经看到的第一个节点,还有其他方法吗?

最佳答案

作为面试测验,我已经听到了这个确切的问题。

最优雅的解决方案是:

将两个指针都放在第一个元素上(分别称为A和B)

然后继续循环::

  • 将A前进到下一个元素
  • 再次将A前进到下一个元素
  • 将B前进到下一个元素
  • 每次更新指针时,请检查A和B是否相同。
    如果在某些时候指针A和B相同,那么您就有一个循环。
    这种方法的问题是,您可能最终会在循环中移动两次,但使用指针A时最多只能进行两次

    如果要实际找到具有两个指向它的指针的元素,则难度更大。我会不知所措,说只有两个指针是不可能的,除非您愿意多次重复链接列表。

    拥有更多内存的最有效方法是将指向数组和元素的指针放在数组中,对其进行排序,然后寻找重复的对象。

    关于loops - 在单链接列表中检测循环的开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1536944/

    相关文章:

    c++ - "expected unqualified-id"上的 "using"编译失败

    C++ 在句子中查找单词

    c++ - 如何跳出循环?

    c++ - Qt:QButtonGroup的QList

    java - 编写一个方法 cut(LinkList x),将列表 x 分成两个(大致)相等的两半,并将后半部分放在前半部分的前面

    java - 找到并单击按钮 Java Robot

    Jquery:如果类存在

    javascript - for循环和执行顺序

    jquery - 如何计算渲染部分中的循环?

    python - 如何以 block 的形式迭代列表