首先讨论下有环单链表相关问题
1. 判断单链表是否有环
使用slow,fast指针从头开始扫描链表,slow指针每次走一步,fast指针每次走两步,如果链表有环,那么fast指针一定会追上slow指针,否则,fast指针会遇到null。
2. 求有环单链表的环长
设环长为R,当fast,slow指针相遇是在环中某一点c处时,继续让slow每次走一步,fast每次走两步,同时开始记录slow指针走的步数,等fast,slow指针再次相遇时,有
slow指针走了 len
fast指针走了 2len
由于fast与slow同起点出发并追上了slow,他们所走的路长之差就恰好为R,即 R = 2len - len = len,即环的长度。
3. 求有环单链表的环连接点起始位置
依然使用fast,slow指针,fast指针每次走两步,slow指针每次走一步,它们第一次相遇时,令fast指针指向链表开头,每次走一步,slow指针依然每次走一步,fast,slow指针再次相遇时的节点就是环连接的起始节点。
证明如下:
第一次相遇时:
slow指针走的步长为 Sab + Sbc
fast指针走的步长为 Sab + Sbc + nR,其中 n = 1,2,3 ......
fast指针的速度是slow指针速度的两倍,故有
2(Sab + Sbc) = Sab + Sbc + nR,得 Sab = nR - Sbc = (n-1)R + Scb
4. 求有环单链表的链表长
由2知道环长,由3知道Sab,那么单链表的长度也就知道了。
leetcode相关题目如下:
Linked List Cycle
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?