java 链表中环的问题

来源:互联网 发布:cr2批量转换软件 编辑:程序博客网 时间:2024/05/18 22:43
问题一,如何判断一个链表当中是否存在环
问题二,假如存在环,请找出环的入口,
问题三,假如存在环,请求出环的长度。


问题一:设置两个指针,一个快,每次走两步,一个慢,每次走一步,假如他们两能相等,那么说明这个链表存在环。


问题二:同样两个快慢对象,第一次相遇后,将其中任意一个放回到起点,然后两个对象都以每次走一步的速度前进,再次相遇后,则该点为环的起点


问题三:同样两个快慢对象,第一次相遇后,开始计时一次,还是一个快,一个慢,期间两个对象不等,则再加一,第二次相遇后,停止计数,返回这个数据,


就是环的长度




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;
}
}
原创粉丝点击