链表(环)
1.创建环⭐
①.循环得到链表最后一个节点。
②.使最后一个节点的next指向链表中的节点。
public void creatHuan(){
ListNade cur=this.head;
if(cur!=null){
while(cur.next!=null){
cur=cur.next;
}
cur.next=this.head.next;
}
}
2.判断是否存在环⭐⭐⭐
①.定义快慢指针,快指针一次走2步,慢指针一次走1步。
②.快慢指针能相遇,则存在环。
public boolean hasCycle(){
ListNade fast=this.head;
ListNade slow=this.head;
while (fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(fast==slow){
return true;
}
}
return false;
}
3.找环的接入点⭐
利用判断环是否存在的知识。
①.快慢指针第一次相遇。
②.让慢指针指向头结点。
③.快慢指针一次一步走。
④.再次相遇的节点就是环的接入点。
public ListNade detectCycle(){
ListNade fast=this.head;
ListNade slow=this.head;
while (fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(fast==slow){
break;
}
}
if(fast==null||fast.next==null){
return null;
}
slow=this.head;
while(fast!=null&&slow!=fast){
fast=fast.next;
slow=slow.next;
}
return slow;
}
4.求环的长度⭐
利用判断环是否存在的知识。
①.快慢指针第一次相遇。
②.快指针不动,慢指针一次一步走,count++(计数)。
③.快慢指针再次相遇,count的值为环的长度。
public int listLenth(){
ListNade fast=this.head;
ListNade slow=this.head;
while (fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(fast==slow){
break;
}
}
if(fast==null||fast.next==null){
return 0;
}
int count=1;
//slow==fast
slow=slow.next;
while(slow!=fast){
slow=slow.next;
count++;
}
return count;
}