内容简介:当单向链表中存在环的时候,遍历此链表会发生无限循环,无法到达末尾(入环后链表就不存在末尾了)的情况,所以在可能发生这种情况的时候,需要检查链表中是否存在一个环。检查是链表是否存在环的方法就是「下面的动图解释了这一过程:
当单向链表中存在环的时候,遍历此链表会发生无限循环,无法到达末尾(入环后链表就不存在末尾了)的情况,所以在可能发生这种情况的时候,需要检查链表中是否存在一个环。
检查是链表是否存在环的方法就是「 龟兔赛跑 」法:乌龟和兔子同时从头节点开始遍历链表,兔子遍历的速度大于乌龟的速度,如果链表中存在环,兔子和乌龟就会先后进环,由于兔子的速度比乌龟快,他们必然会在环内相遇。
下面的动图解释了这一过程:
这个算法的美妙之处在于,乌龟和兔子相遇的地方和环入口点的位置是有关系的。
根据动画所示,我们令兔子的遍历速度为2,乌龟的遍历速度为1,则他们的速度差也为1。设乌龟进环的时候已经遍历了 个节点,那么此时兔子也已经在环内遍历了 个节点。若令环的大小为 ,兔子和乌龟在环内的遍历就是一次追及问题,兔子需要追上乌龟的距离为 。由于兔子和乌龟的速度差为1,所以追及时间 ,那么乌龟和兔子相遇的点距离环入口也就是 了。此时只需要将兔子放回起点,并把兔子的遍历速度换成1,则乌龟将会和兔子在环入口处再次相遇。
最后附上 Java 算法:
LinkedListNode solve(LinkedListNode head) {
LinkedListNode rabbit = head;
LinkedListNode turtle = head;
while (rabbit != null && rabbit.next != null) {
rabbit = rabbit.next.next;
turtle = turtle.next;
if (rabbit == turtle) break;
}
if (rabbit == null || rabbit.next == null) return null;
rabbit = head;
while (rabbit != turtle) {
rabbit = rabbit.next;
turtle = turtle.next;
}
return rabbit;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
软件测试经验与教训
Cem Kaner、James Bach、Bret Pettichord / 机械工业出版社 / 2004-1 / 35.00
本书汇总了293条来自软件测试界顶尖专家的经验与建议,阐述了如何做好测试工作、如何管理测试,以及如何澄清有关软件测试的常见误解,读者可直接将这些建议用于自己的测试项目工作中。这些经验中的每一条都是与软件测试有关的一个观点,观点后面是针对运用该测试经验的方法、时机和原因的解释或例子。 本书还提供了有关如何将本书提供的经验有选择性地运用到读者实际项目环境中的建议,在所有关键问题上所积累的经验,以......一起来看看 《软件测试经验与教训》 这本书的介绍吧!