环形链表问题是快慢指针的一个典型应用。其实,称其为“有环链表”更为准确。
在有环链表中,利用快慢指针可以解决的问题包括:
判断链表是否有环、求环的入口、求环的长度、求链表的总长度(总节点数),等。
目录
具体步骤:
初始,slow和fast都从链表头节点head开始,fast每次走2步,slow每次走1步。如果fast走到链表尾部,说明链表无环;否则,链表有环,fast和slow必定在环中的某个节点第一次相遇。【判断是否有环get】
第一次相遇后,令fast重新指向head,slow不变。二者重新开始以相同速度移动,则第二次相遇时的节点必是环的入口节点。【环的入口get】在此过程中,若记录下fast移动的步数则是链表中非环部分的长度LengthLine。【非环的长度get】
已知环的入口节点后,令一个指针绕环走一圈,就得到了环的长度LengthLoop。【环的长度(2) get】LengthLine + LengthLoop即为链表的总长度。【链表总长度get】
如果只求环的长度,还有另一种方法:fast和slow第一次在环中相遇后,以此作为起点,fast仍然每次走2步,slow每次走一步。当两个指针第二次在环中相遇时,fast恰好比slow多走了一圈。因此用fast走过的步数减去slow走过的步数,则为环的长度。【环的长度(1) get】
Java代码如下: