快慢指针:定义两个指针,这两个指针移动的速度一快一慢,一般情况下,快指针的移动步长是慢指针的两倍。显然我们可以知道,如果链表中有环那么快慢指针一定会相遇。如果有环,让其中一个指针指向头指针,然后这两个指针每次走一步,那么它们第一次相遇的点即为链表的入口结点。环的入口结点看下面图中的分析。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
ListNode fast = pHead, slow = pHead;
boolean flag = false;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) { // 有环
flag = true;
break;
}
}
if (!flag) return null;
slow = pHead; //有环
while (slow != fast) { // 找到入口结点
slow = slow.next;
fast = fast.next;
}
return slow;
}
} 
京公网安备 11010502036488号