如何判断一个单链表是否有环?有环的话返回进入环的第一个节点的值,无环的话返回-1。
从链表头节点开始遍历,一个快速每次2个单位,一个慢每次一个单位,如果过程中出现相等就代表有环,此时慢遍历依然照常遍历,另从头节点开始另一个慢遍历,前后两次慢遍历出现相等时,就是入环的第一个
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class ChkLoop {
public int chkLoop(ListNode head, int adjust) {
if (head == null) {
return -1;
}
if (head.next == null || head.next.next == null
|| head.next.next.next == null) {
return -1;
}
ListNode fast = head.next.next, slow = head.next;
while (fast != null && fast != slow) {
fast = fast.next != null ? fast.next.next : null;
slow = slow.next;
}
if (fast == null) {
return -1;
}
fast=head;
while(fast!=slow){
fast=fast.next;
slow=slow.next;
}
return fast.val;
}
}