单链表主类
检测思路
假设一个单链表是环形链表,那么该链表的元素总数可分为两部分
size = m + n
其中m
是直线部分,n
是环形部分
假想这是一个跑道,从直线跑道为起点,之后进入环形跑道,然后一直绕着环形跑道跑
现在有两个人一起从起点出发,速度不一致,快的速度为v
,慢的速度为w
,有v>w>0
假设两人足够有力量跑下去,那么这两人会不会在环形跑道的某点相遇呢?
经过时间t
之后,如果满足如下公式,则两人可再次相遇
vt - wt = kn
其中k
为整数
另一种说法就是:足够时间后,跑快的人是否一定可以超跑慢的人正好整数圈呢?
答案是肯定的,n
就算再大,也经不起足够长的时间t
,v-w
就算再小,只要是个正数,就一定能在某个时间t
后正好甩另一个人正好整数圈
单链表中环的检测就是利用了这个思想
代码
public boolean isCircle() {
// 边界
if (header == null) {
return false;
}
// 相同的起跑线
SinglyLinkedNode<T> faster = header, lower = header;
// 如果跑快的人到达了终点,说明这条跑道没有环形部分
while (faster != null && faster.getNext()