假设您在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;
}
}