判断链表有无环的方法:
设置一个快指针速度 != 慢指针的速度,这就是物理里的相遇问题,我开始犯了一个错,我设置快指针和慢指针的速度相等,所以答案出错,原因是速度相等,那么它们在坐标轴上的速度永远是平行的,除非数组的长度很小,可以相遇一次,否则不能相遇。
如果快指针和慢指针相遇则有环。
求环的起点:当两指针相遇的时候,将快指针指向链表起点,并且速度设置为和慢指针速度相等,当两指针相遇的时候,此节点则是环的起点。
所以设置快指针速度为2,慢指针速度为1,只要不相等就可以,然后考虑边界问题,一般都是节点不为空。
下面是求解环的起点代码:
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
if(head == null || head.next == null)return null;
ListNode node = head.next.next;//快指针
ListNode p = head;
head = head.next;//慢指针
while(node != null && node.next != null){
if(node == head){//判断快指针和慢指针是否相遇,如果两者指向同一个节点,则是有环,接下来快指针指向链表头结点,速度和慢指针相同
while(p != node){//如果两个指针相同,则返回环的起点。
p = p.next;
node = node.next;
}
return p;
}
head = head.next;
node = node.next.next;
}
return null;
}
}