public static Node entryNode(Node head){
if(head==null)return null;
Node p=isloop(head); //环中某一节点
Node q=p.next; //计算环中结点个数
int count=1; //环的结点总数量count
while(q!=p){ q=q.next;
count++;
}
//找到环入口
p=head; //快指针
q=head; //慢指针
for(int i=0;i<count;i++){//第一个结点先走count步
p=p.next;
}
while(p!=q){ //快慢一起走,相等则为入口
p=p.next;
q=q.next;
}
return p;
}
public static Node isloop(Node head){//链表是否有环
Node first=head.next;//first在second后面原因:防止在环之前两者相等
Node second=head;
while(first.next!=null&&first.next.next!=null){
if(first==second){
return first;
}
first=first.next.next;
second=second.next;
}
return null;
}