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;
}
}
问题二,假如存在环,请找出环的入口,
问题三,假如存在环,请求出环的长度。
问题一:设置两个指针,一个快,每次走两步,一个慢,每次走一步,假如他们两能相等,那么说明这个链表存在环。
问题二:同样两个快慢对象,第一次相遇后,将其中任意一个放回到起点,然后两个对象都以每次走一步的速度前进,再次相遇后,则该点为环的起点
问题三:同样两个快慢对象,第一次相遇后,开始计时一次,还是一个快,一个慢,期间两个对象不等,则再加一,第二次相遇后,停止计数,返回这个数据,
就是环的长度
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;
}
}
阅读全文
0 0
- java 链表中环的问题
- Java的版本问题
- Java的编码问题!
- Java的面试问题:
- JAVA的中文问题
- 我的Java问题
- JAVA的加密问题
- Java的国际化问题
- Java 的i18n问题
- java时间的问题
- java问题的收集
- java的内存问题
- java排序的问题
- Java的路径问题
- Java程序的问题
- Java常见的问题
- Java面试的问题
- Java的路径问题
- Fiddler 如何抓取Android APP的数据
- mybatis-动态sql(foreach),映射
- vijos1019:补丁VS错误——题解
- PHP实现文件的下载
- Unity3D-Time&Mathf类
- java 链表中环的问题
- 双队列
- 我是如何把知识快速转化为金钱的?
- FAT32文件系统之目录项分析 (四)
- Django学习07---model模型以及关系模型
- Java基础之重写equals方法的同时为什么要重写hashCode方法
- 【PHP】 买苹果
- CCPC 长春 2016 Triangle Fib数列
- jar包验证码