当前位置: 首页 > 面试题库 >

Java如何检测链表中的循环?

阙项禹
2023-03-14
问题内容

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

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

每个节点都指向下一个节点,但最后一个节点除外,后者的下一个为空。假设列表有可能包含一个循环-即最终的Node而不是null,而是引用了列表中位于其之前的节点之一。

最好的写作方式是什么

boolean hasLoop(Node first)

true如果给定的Node是带有循环的列表的第一个,则将返回false什么,否则返回?你怎么写才能占用恒定的空间和合理的时间?


问题答案:

想法是要有两个引用列表,并以不同的速度移动它们。一个向前移动一个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;
    }
}


 类似资料:
  • 最近,我已经完成了检测循环中第一个节点的算法,如下所述:- 注:本声明摘自以下网站:- http://javabypatel.blogspot.in/2015/12/detect-loop-in-linked-list.html 步骤1:找到循环后,两个指针都指向在循环内的交汇点的公共节点, 步骤2:现在,在它们之间移动一个指针(比如乌龟)到列表的头部,保持野兔指针在循环内的交汇点的相同位置。 步

  • 我试图克隆一个循环链表,就像你克隆一个单链表一样,但是我遇到了麻烦。 我试图在公共方法clone()中只留下调用clone()的受保护方法的那一行,但是程序仍然抛出错误。 } 此代码在使用单个链接列表时有效。预期的输出是打印两次的链接列表,但实际的输出是抛出的异常“CloneNotSupported”。请注意,当clone()返回空列表时,程序不会抛出此异常。

  • 问题内容: 您好,我正在尝试创建一个遍历链表的for循环。对于每条数据,它将单独列出。我正在尝试在此处学习链接列表,因此请不要提供数组建议。有人知道怎么做吗? 示例输出: 187号航班 501航班 我的代码如下: 问题答案: 只需使用增强的for循环,就像使用数组一样:

  • 问题内容: 如何检测Java中给定的SQL数据库中是否存在某个表? 问题答案: 您可以使用DatabaseMetaData.getTables()获取有关现有表的信息。 该方法透明地工作,并且独立于数据库引擎。我认为它查询后台的信息模式表。 编辑: 这是一个显示所有现有表名的示例。

  • 问题内容: 我在面试中被问到以下问题:“如何检测链表中的循环?”,我解决了这个问题,但立即面试官问我如何删除链表中的循环。我摸索了 那么关于如何解决这个问题的任何指针,可能是伪代码还是方法定义? 我对Java很满意,因此已在Java下标记了这个问题。 对于实例,此链接列表具有循环 问题答案: 此问题有两个部分: 检测列表中是否存在循环 确定循环的开始 一旦知道了循环的开始位置,就很容易识别列表中的

  • 如何在java脚本中识别/检测循环对象类型? 圆形对象的示例: 如果我们尝试使用JSON字符串化循环对象。stringify(obj),它将抛出一个错误,如下所示 在JSON. stringify()将循环结构转换为JSON