判断是否有环:
设置两个指针,第一个一次走一步,第二个一次走两步,如果相遇,则有环,他们走过的步数差,为环的长度n。如果第二个指针先为null,则无环。
找到入口节点
若有环,设置两个指针,第二个指针先走n步,随后两个指针一次走一步,他们的值相等的那个节点,就是入口节点。
public ListNode EntryNodeOfLoop(ListNode pHead)
{
ListNode oneStep = pHead;
ListNode twoStep = pHead;
int len = 0;
boolean have_circle = false;
for(int count=0;twoStep!=null;count++) {
oneStep = oneStep.next;
twoStep = twoStep.next;
if(twoStep==null) {
return null;
}
twoStep = twoStep.next;
if(oneStep.val == twoStep.val) {
len = count;
have_circle = true;
break;
}
}
if(twoStep==null&&have_circle == false) {
return null;
}else {
oneStep = pHead;
twoStep = pHead;
for(int count = 0;count<=len;count++) {
twoStep = twoStep.next;
}
while(twoStep.val!=oneStep.val) {
oneStep = oneStep.next;
twoStep = twoStep.next;
}
return twoStep;
}
}