给定一个链表,返回链表开始入环的第一个节点,如果无环,则返回null
思路 :假设单链表有环的话,设头节点到入环点的距离为x,单链表的环的周长为C,入环点到它们相遇点的距离为y,那么slow走的距离也就是x+y,因为
fast比slow速度快,设slow走到相遇点的时候fast已经在环里面走了N圈,那么slow走的距离和fast走的距离之间的关系也就是2(x+y) = x+y+NC.化简一下也就是x+y = NC,x = NC-Y,此时再让slow从头开始一步一步走,fast也一步一步走,它们再次相遇的点也就是入环点的位置。
代码示例:
public Nodee decectCycle() {//返回入环点
Nodee fast = this.head;//定义一个快指针,一个慢指针。
Nodee slow = this.head;
while (fast != null && fast.next != null) {//循环条件是当fase不等于null并且fast.next不等于null的时候。说明两种情况都不可以。
if (fast == slow) {//如果中途遇到fast和slow相等了。说明fast不会走到null或者.next=null,说明是一个环
fast = this.head;//此时让fast又从头开始走
while (fast != slow) {//当fast和slow再次相遇的时候此时就是入环点
fast = fast.