问题一,如何判断一个链表当中是否存在环
问题二,假如存在环,请找出环的入口,
问题三,假如存在环,请求出环的长度。
问题一:设置两个指针,一个快,每次走两步,一个慢,每次走一步,假如他们两能相等,那么说明这个链表存在环。
问题二:同样两个快慢对象,第一次相遇后,将其中任意一个放回到起点,然后两个对象都以每次走一步的速度前进,再次相遇后,则该点为环的起点
问题三:同样两个快慢对象,第一次相遇后,开始计时一次,还是一个快,一个慢,期间两个对象不等,则再加一,第二次相遇后,停止计数,返回这个数据,
就是环的长度
public class Demo9 {
public static void main(String[] s){
Node head=new Node(3);
Node node1=new Node(6);
Node node2=new Node(8);
Node node3=new Node(5);
Node node4=new Node(2);
Node node5=new Node(7);
head.next=node1;
node1.next=node2;
node2.next=node3;
node3.next=node4;
node4.next=node5;
node5.next=node3;
boolean flag=test( head);//是否存在环
//求环的起点和环的长度
if(flag){
//环的起点
System.out.println(test2(head).val);
//求环的长度
System.out.println(test3(head));
}
}
//判断是否存在环
public static boolean test(Node head){
Node index1=head;//慢指针
Node index2=head;//快指针
while(index1!=null&&index2!=null){
index1=index1.next;
index2=index2.next.next;
if(index1==index2){
return true;
}
}
return false;
}
//求出环的起点
public static Node test2(Node head){
Node index1=head;//慢指针
Node index2=head;//快指针
while(index1!=null&&index2!=null){
index1=index1.next;
index2=index2.next.next;
//第一次相遇的地方
if(index1==index2){
index1=head;
while(index1!=index2){
index1=index1.next;
index2=index2.next;
}
if(index1==index2){
return index1;
}
}
}
return null;
}
public static int test3(Node head){
Node index1=head;//慢指针
Node index2=head;//快指针
while(index1!=null&&index2!=null){
index1=index1.next;
index2=index2.next.next;
//第一次相遇的地方
if(index1==index2){
int count=0;
while(true){
count++;
index1=index1.next;
index2=index2.next.next;
if(index1==index2){
return count;
}
}
}
}
return 0;
}
}
class Node{
int val;
Node next=null;
public Node(int val){
this.val=val;
}
}
问题二,假如存在环,请找出环的入口,
问题三,假如存在环,请求出环的长度。
问题一:设置两个指针,一个快,每次走两步,一个慢,每次走一步,假如他们两能相等,那么说明这个链表存在环。
问题二:同样两个快慢对象,第一次相遇后,将其中任意一个放回到起点,然后两个对象都以每次走一步的速度前进,再次相遇后,则该点为环的起点
问题三:同样两个快慢对象,第一次相遇后,开始计时一次,还是一个快,一个慢,期间两个对象不等,则再加一,第二次相遇后,停止计数,返回这个数据,
就是环的长度
public class Demo9 {
public static void main(String[] s){
Node head=new Node(3);
Node node1=new Node(6);
Node node2=new Node(8);
Node node3=new Node(5);
Node node4=new Node(2);
Node node5=new Node(7);
head.next=node1;
node1.next=node2;
node2.next=node3;
node3.next=node4;
node4.next=node5;
node5.next=node3;
boolean flag=test( head);//是否存在环
//求环的起点和环的长度
if(flag){
//环的起点
System.out.println(test2(head).val);
//求环的长度
System.out.println(test3(head));
}
}
//判断是否存在环
public static boolean test(Node head){
Node index1=head;//慢指针
Node index2=head;//快指针
while(index1!=null&&index2!=null){
index1=index1.next;
index2=index2.next.next;
if(index1==index2){
return true;
}
}
return false;
}
//求出环的起点
public static Node test2(Node head){
Node index1=head;//慢指针
Node index2=head;//快指针
while(index1!=null&&index2!=null){
index1=index1.next;
index2=index2.next.next;
//第一次相遇的地方
if(index1==index2){
index1=head;
while(index1!=index2){
index1=index1.next;
index2=index2.next;
}
if(index1==index2){
return index1;
}
}
}
return null;
}
public static int test3(Node head){
Node index1=head;//慢指针
Node index2=head;//快指针
while(index1!=null&&index2!=null){
index1=index1.next;
index2=index2.next.next;
//第一次相遇的地方
if(index1==index2){
int count=0;
while(true){
count++;
index1=index1.next;
index2=index2.next.next;
if(index1==index2){
return count;
}
}
}
}
return 0;
}
}
class Node{
int val;
Node next=null;
public Node(int val){
this.val=val;
}
}