java - 如何检测链表中的循环?

标签 java algorithm data-structures linked-list

假设您在 Java 中有一个链表结构。它由节点组成:

class Node {
    Node next;
    // some user data
}

并且每个Node都指向下一个节点,除了最后一个Node,它的next为null。假设列表有可能包含一个循环 - 即最终节点,而不是 null,具有对列表中在它之前的节点之一的引用。

最好的写作方式是什么

boolean hasLoop(Node first)

如果给定节点是带有循环的列表的第一个,则返回 true,否则返回 false?你怎么能写出来,让它占用恒定的空间和合理的时间?

这是带有循环的列表的图片:

alt text

最佳答案

您可以使用Floyd's cycle-finding algorithm ,也称为龟兔算法

这个想法是有两个对列表的引用并以不同的速度移动它们。一个向前移动 1 节点,另一个向前移动 2 节点。

  • 如果链表有循环,它们 一定会见面的。
  • 其他任何一个 两个引用(或它们的 next) 将变为 null

实现算法的Java函数:

boolean hasLoop(Node first) {

    if(first == null) // list does not exist..so no loop either
        return false;

    Node slow, fast; // create two references.

    slow = fast = first; // make both refer to the start of the list

    while(true) {

        slow = slow.next;          // 1 hop

        if(fast.next != null)
            fast = fast.next.next; // 2 hops
        else
            return false;          // next node null => no loop

        if(slow == null || fast == null) // if either hits null..no loop
            return false;

        if(slow == fast) // if the two ever meet...we must have a loop
            return true;
    }
}

关于java - 如何检测链表中的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2663115/

相关文章:

java - 寻找二维数组中的最小邻居

java - 如何使用 Apache poi 保存 word docx 文件。更改为 saxon9he 而不是 saxon9pe

java - Angular 客户端发布 Spring boot REST Api 请求

java - 在数组上执行笛卡尔积

c - 合并给定空间中的元素数组

c# - 获取对象结构差异和统计信息的模式或如何创建差异工具

java - 从远程计算机访问 JBOSS Tomcat Web 应用程序

arrays - 在一组树中找到正方形

algorithm - CRC校验和如何给出错误发生的位置?

javascript - 在javascript中展平嵌套对象