本站发布的所有文件/源码/文档/软件等均提供免费下载。
但本站带宽较低、流量有限,为防止恶意下载、盗刷流量,所以只能登陆网站后才能下载!
若给您带来不便请见谅~
为了方便,您可以通过qq授权登陆,也可以通过钉钉授权登陆。也可以通过邮箱注册后登陆。
判断单链表是否有环以及求环的入口和环长度2种方案分析-附java代码
/**
* 链表节点类
* @author 硅谷探秘者(jia)
*/
class Node{
public int data;
public Node next;
public Node(int data) {
this.data=data;
}
public Node(Node next,int data) {
this.data=data;
this.next=next;
}
}
public class A3 {
public static void main(String[] args) {
/**
* 构造链表 15->14->13->12->11->10->9->8->7->6->5->4->3->2->1->8
*/
Node n1=new Node(1);
Node n2=new Node(n1,2);
Node n3=new Node(n2,3);
Node n4=new Node(n3,4);
Node n5=new Node(n4,5);
Node n6=new Node(n5,6);
Node n7=new Node(n6,7);
Node n8=new Node(n7,8);
Node n9=new Node(n8,9);
Node n10=new Node(n9,10);
Node n11=new Node(n10,11);
Node n12=new Node(n11,12);
Node n13=new Node(n12,13);
Node n14=new Node(n13,14);
Node n15=new Node(n14,15);
n1.next=n10;
Node e=cycles(n15);
if(e!=null) {
System.out.println("入口地址:"+e.data);
int length=length(e,e);
int length2=lengthX(n15,e);
System.out.println("环的长度:"+length);
System.out.println("链表长度:"+(length+length2));
}else {
System.out.println("没有成环");
}
}
/**
* 判断链表是否成环,是返回环的入口节点,否则返回null
* @param n
* @return
*/
public static Node cycles(Node n) {
if(n.next!=null&&n.next.next!=null) {
Node slow = cycle(n.next,n.next.next);
if(slow!=null)
return entrance(n,slow);
else
return null;
}else {
return null;
}
}
/**
* 递归判断是否成环
* @param slow 慢指针
* @param fast 快指针
* @return
*/
public static Node cycle(Node slow,Node fast) {
if(fast==null)
return null;
else
if(slow==fast)
return slow;
else
if(fast.next!=null&&fast.next.next!=null)
return cycle(slow.next,fast.next.next);
else
return null;
}
/**
* 寻找入口地址
* @param slow
* @param fast
* @return
*/
public static Node entrance(Node slow,Node fast) {
if(slow==fast) return slow;
else return entrance(slow.next, fast.next);
}
/**
* 计算链表长度
* @param n
* @param e
* @return
*/
public static int length(Node n,Node e) {
n=n.next;
if(n==e) return 1;
else return 1+length(n, e);
}
/**
* 计算头节点到环的入口的长度
* @param n
* @param e
* @return
*/
public static int lengthX(Node n,Node e) {
if(n==e)
return 0;
else
return length(n, e);
}
}
猜你喜欢
数据结构与算法
10506
问题:如上图的一个链表,如何判断一个链表中是否存在环,以及如何求出环的入口以及何如求出链表的长度。方案一:利用hash表首先准备一个hash表如hashMap等,然后从链表头部遍历链表,每次遍历一个
数据结构与算法
1846
胜利者,求胜利者的编号,以及出局者的顺序。解决方案使用双向循环链表测试数据m=9,n=5输出:517436928代码(c++描述)Node.h#pragmaonceclassNode{public: i
weblog
1768
java判断请求的浏览器类型是否是ie浏览器importjavax.servlet.http.HttpServletRequest;/*** 浏览器类型判断*@author硅谷探秘者(jia
blog
js判断字符串是否为整数的方法
前端(h5)
2119
js判断字符串是否为整数的方法原文:https://www.jb51.net/article/144255.htm判断字符串str是否为表达整数代码:if(!/^\d+$/.test(str
mqtt协议
1602
能表示数据包大小的最大值是256M。 对剩余长度字段的编解码,可理解为128进制的运算。如果低位字节满128,则向高位字节进1。那么进位系数就是128。 下面是用一段代码描述对剩余长度字段的计算方
blog
web项目判断请求是否为ajax异步请求
工具
2036
web项目判断请求是否为ajax异步请求importjavax.servlet.http.HttpServletRequest;publicclassAjaxUtil
blog
Java内存区域与内存溢出异常
java基础
3751
至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 经常有人把Java内存区域笼统地划分为堆内存(Heap)和栈内存(Stack),这种划分方式直接继承自传统的C、C++程序的内存布
keepalived,nginx,linux
1600
宕机那么所有对外提供的接口都将导致无法访问。虽然我们无法保证服务器百分之百可用,但是也得想办法避免这种悲剧,今天我们使用keepalived来实现Nginx的高可用。双机热备方案 这种方案是国内企业