爪哇2博客
爪哇2博客

如何使用示例在Java中的链表中检测循环

如果您想练习数据结构和算法程序,可以通过 数据结构和算法面试题.

当今最受欢迎的面试问题之一是“如何在LinkedList中检测循环/循环”。所以我认为我应该解决这个问题。这个问题与数据结构更相关。您也可以找到 循环的起始节点 如果循环存在。

爪哇链表面试程序:

第一种方法 您可能认为可能是这样:

  • 遍历每个节点直到结束,使用访问标记跟踪访问的节点。
  • 如果找到已经访问过的节点,则LinkedList中有一个循环;如果遍历时到达终点,则LinkedList中没有循环

但是上述方法的问题是,在大多数情况下,您无法更改LinkedList节点的数据结构,因此您赢得了’不能向其添加访问标记。

高效的方法:

弗洛伊德将是解决这个问题的有效方法’的周期检测算法,因此该算法的步骤为:
  • 使用两个指针fastPtr和slowPtr并将其初始化为链表的开头
  • 在每次迭代中,将fastPtr移动两个节点,将slowPtr移动一个节点。
  • 如果fastPtr和slowPtr在某个迭代中相遇,则链表中会有一个循环。
  • If fastPtr reaches to the end of linkedlist without meeting slow pointer then there is no loop in linkedlist (i.e fastPtr->下一页 or fastPtr->下一页->下一页 become 空值)

该算法的Java代码将是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
上市 布尔值 如果LoopExists() {
  节点 fastPtr = ;
  节点 慢点 = ;
   (fastPtr != 空值 && fastPtr.下一页 != 空值) {
   fastPtr = fastPtr.下一页.下一页;
   慢点 = 慢点.下一页;
   如果 (慢点 == fastPtr)
    返回 真正;
 
  }
  返回 ;
}
 

以上解决方案在o(n)时间复杂度和o(1)空间复杂度下工作。

让我们创建没有循环的链表:

让我们创建一个名为 “LinkedList.java”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
组织.Arpit.爪哇2blog;
 
上市 链表{
 
    私人的 节点 ;
 
    私人的 静态的 节点 {
        私人的 整型 ;
        私人的 节点 下一页;
 
        节点(整型 ) {
            这个. = ;
 
        }
    }
 
    上市 虚空 addToTheLast(节点 节点) {
 
        如果 ( == 空值) {
             = 节点;
        } 其他 {
            节点 温度 = ;
             (温度.下一页 != 空值)
                温度 = 温度.下一页;
 
            温度.下一页 = 节点;
        }
    }
 
    上市 虚空 打印列表() {
        节点 温度 = ;
         (温度 != 空值) {
            系统..格式(“%d”, 温度.);
            温度 = 温度.下一页;
        }
        系统..打印();
    }
 
    上市 布尔值 如果LoopExists() {
        节点 fastPtr = ;
        节点 慢点 = ;
         (fastPtr != 空值 && fastPtr.下一页 != 空值) {
            fastPtr = fastPtr.下一页.下一页;
            慢点 = 慢点.下一页;
            如果 (慢点 == fastPtr)
                返回 真正;
 
        }
        返回 ;
    }
 
    上市 静态的 虚空 主要([] args) {
        链表 清单 = 链表();
        //创建链接列表
 
        清单.addToTheLast( 节点(5));
        清单.addToTheLast( 节点(6));
        清单.addToTheLast( 节点(7));
        清单.addToTheLast( 节点(1));
        清单.addToTheLast( 节点(2));
 
        清单.打印列表();
 
        //测试循环是否存在
        系统..打印(“循环存在->" + 清单.如果LoopExists());
 
    }
}
 

从逻辑上讲,我们的链表可以表示为:

运行上面的程序,您将获得以下输出:

1
2
3
4
 
5 6 7 1 2
循环 存在->
 

让我们在链表中创建一个循环

现在我们将最后一个节点连接到值为7的节点,它将在链表中创建循环,因此将上述main方法更改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
上市 静态的 虚空 主要([] args) {
        链表 清单 = 链表();
        //创建链接列表
        节点 loopNode= 节点(7);
        清单.addToTheLast( 节点(5));
        清单.addToTheLast( 节点(6));
        清单.addToTheLast(loopNode);
        清单.addToTheLast( 节点(1));
        清单.addToTheLast( 节点(2));
 
        清单.打印列表();
        //创建一个循环
        清单.addToTheLast(loopNode);
        //测试循环是否存在
        系统..打印(“循环存在->" + 清单.如果LoopExists());
 
    }
 

从逻辑上讲,我们的带有循环的链表可以表示为:

运行上面的程序,您将获得以下输出:

1
2
3
4
 
5 6 7 1 2
循环 存在->真正
 

这样便可以在链表中检测到循环。
请通过 爪哇面试程序 有关更多此类程序。

导入联系人

您可能还喜欢:

分享这个

作者

关注作者

相关文章

  • 8月12日

    两个链表的交集

    在这篇文章中,我们将看到如何找到两个链表的交集。问题给定两个单链表,查找两个链表是否相交。如果它们相交,请找到相交点。解决方案这是找到两个链表的交集的简单算法。查找两个单链列表的长度。查找更大的链接列表[…]

  • 10月12日

    在Java中使用链表实现队列

    如果您想练习数据结构和算法程序,则可以解决数据结构和算法面试问题。在本文中,我们将看到如何在Java中使用链接列表实现Queue。队列是抽象数据类型,可演示先进先出(FIFO)行为。我们将使用数组实现相同的行为。尽管java提供了[…]

  • 10月10日

    将排序的链表转换为平衡的BST

    在本文中,我们将看到如何将已排序的LinkedList转换为平衡的二进制搜索树。有两种方法可以做到这一点。解决方案1:将排序后的数组转换为BST非常相似。找到链接列表的中间元素,使其成为根,然后递归执行。时间复杂度:o(nlogn)。 […]

  • 9月20日

    在Java中找到链表的长度

    如果您想练习数据结构和算法程序,则可以阅读数据结构和算法程序。在这篇文章中,我们将看到如何在Java中找到链表的长度。您显然可以使用java链表类的size()方法,但在这里我们将看到如何查找长度[…]

  • 9月20日

    在Java中实现单链表

    在本文中,我们将看到如何在Java中实现单链表。它是最常用的数据结构之一。在单链列表中,Node具有数据和指向下一个节点的指针。它没有指向上一个节点的指针。最后一个节点‘的下一个指向null,因此您可以迭代[…]

  • 9月10日

    在Java中使用链接列表实现堆栈

    如果您想练习数据结构和算法程序,则可以解决100多个数据结构和算法面试问题。在该程序中,我们将看到如何使用Java中的链接列表实现堆栈。堆栈是一种抽象数据类型,它演示了后进先出(LIFO)行为。我们将执行相同的[…]

Comments

  1. 在几种情况下,这看起来像是错误的
    这将适用于奇数循环,如果循环像这样存在?

    5->6->7>8>1>5>6

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


成为朋友

©2020 爪哇2博客