链表是否存在环,有则返回入环结点

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;
 }
点赞