如何检测链表中的循环?

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

类节点{
节点下一步;
//一些用户数据
}

每个节点都指向下一个节点,但最后一个节点除外,该节点的next值为null。假设列表可能包含一个循环,也就是说,最后一个节点不是空的,而是对列表中位于它之前的一个节点的引用

最好的写作方式是什么

布尔hasLoop(节点优先)

如果给定节点是带有循环的列表的第一个节点,则返回true,否则返回false?你怎么能写得如此之快,以至于它需要恒定的空间和合理的时间

下面是一张带有循环的列表的图片:

您可以使用弗洛伊德的周期查找算法,也称为乌龟兔算法

这样做的目的是让列表中有两个引用,并以不同的速度移动它们。通过1节点向前移动一个,通过2节点向前移动另一个

  • 如果链表有一个循环,它们
    肯定会见面
  • 要不然你们两个
    两个引用(或它们的下一个
    将变为null

实现算法的Java函数:

布尔hasLoop(节点优先){
if(first==null)//列表不存在..因此也没有循环
返回false;
Node slow,fast;//创建两个引用。
slow=fast=first;//使两者都指向列表的开头
while(true){
slow=slow.next;//1跳
if(fast.next!=null)
fast=fast.next.next;//2跳
其他的
返回false;//下一个节点null=>无循环
if(slow==null | | fast==null)//如果其中一个命中null..无循环
返回false;
if(slow==fast)//如果这两个词相遇……我们必须有一个循环
返回true;
}
}

发表评论