java链表是否有环(java 链表)
华为云服务器特价优惠火热进行中! 2核2G2兆仅需 38 元;4核4G3兆仅需 79 元。购买时间越长越优惠!更多配置及优惠价格请咨询客服。
合作流程: |
本篇文章给大家谈谈java链表是否有环,以及java 链表对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
微信号:cloud7591如需了解更多,欢迎添加客服微信咨询。
复制微信号
本文目录一览:
- 1、用Java实现判断链表是否有环,环的大小,环的
- 2、简单链表问题(java) :class LinkList
- 3、循环链表的原理与实现
- 4、急急急 如何用Java语言实现判断一个链表是否存在循环连接的算法
用Java实现判断链表是否有环,环的大小,环的
public static void main(String[] args) {
Node list = new Node();
Node top = list;
list.n=1;
for(int i = 2;i 10; i++){
//list的next指向一个新的Node
list.next = new Node();
//新的Node的n赋值为i
list.next.n=i;
//list指向新的Node
list = list.next;
}
list.next = top.next.next.next;
list=top; //让list回到起点,指向头结点
//1.判断有没有环
Node list1 = top;//都至于起点即根节点 慢
Node list2 = top; //快
//思想:两个数同时跑,如果相遇,即是有环
boolean flag=false;
for(;(!(list1==list2))||(list1==list2list1==top);){
System.out.println("进入循环了");
if(list1==null||list1.next==null){
flag=true;
break;
}
list1=list1.next;
list2=list2.next.next;
System.out.println(list1.n + ":" + list2.n);
}
if(flag==true){
System.out.println("此链表没有环");
}else if(flag==false){
System.out.println("此链表有环");
}
//2.环的大小是多少?让他俩在相遇点一起跑,再次相遇慢的跑的举例即是环的长度
int count=0;
for(;;){
list1=list1.next;
list2=list2.next.next;
count++;
if(list1==list2){
break;
}
}
System.out.println("环的长度是:" + count);
//3环的切入点是多少?
list1=top;
for(;!(list1==list2);){
list1=list1.next;
list2=list2.next;
}
System.out.println("环的切入点是"+list1.n);
//4.链表的长度:
list1=top;
for(;!(list1==list2);){
list1=list1.next;//将一个拉回节点
count++;
}
System.out.println("链表的长度为:" + count);
}
}
//链表的节点:
class Node{
int n;
Node next;
}

简单链表问题(java) :class LinkList
public LinkList (Object obj)
{
firstNode = new Node();
firstNode.obj=obj;
lastNode =firstNode;
}
构造函数,只有一个node的list,firstNode和lastNode都指向它,这个是头结点
public void openedNode(Object obj)
{
lastNode =new Node();
lastNode =lastNode.nextNode;
lastNode.obj=obj;
}
如果这个方法是要在list中加个node的话就是写错了,它的Node中的nextNode是自己指向自己的,不是链表,是链表环, 应该是:
public void openedNode(Object obj)
{
lastNode =new Node();
firstNode.nextNode =lastNode;
lastNode.obj=obj;
}
这个方法是lastNode指向一个新的node,将firstNode中的nextNode引用指向lastNode,将lastNode中的obj赋值为obj参数,这样两个node就连起来了,构造函数中的Node叫头节点,里面不要放数据,Node类中最好有一个变量始终指向头结点,建议参考一下c语言数据结构的链表部分
循环链表的原理与实现
其实循环链表相对于单链表来讲只需要做一些小改动就好了,只需要将单链表尾结点的引用由null改为头结点就好了,这样子就形成了一个循环链表。循环链表相对于单链表来讲,可以从任意结点开始就可以遍历整个链表的所有结点,这是单链表无法做到的。
关于 约瑟夫环问题
,大家可以参考一下百度百科,实现的方法也有很多种,但是都逃不开用循环链表。
笔者用java来实现,感兴趣的也可以根据自己喜好的语言来进行实现。
急急急 如何用Java语言实现判断一个链表是否存在循环连接的算法
编写两个java类,一个为Linkitem.java,另一个为测试类LinklistTest.java,分别如下:
*****************************************************
//Linkitem.java
public class Linkitem {
Linkitem previous;
String data;
Linkitem next;
public Linkitem() {
}
public Linkitem(Linkitem previous, String data, Linkitem next) {
super();
this.previous = previous;
this.data = data;
this.next = next;
}
public Linkitem getPrevious() {
return previous;
}
public void setPrevious(Linkitem previous) {
this.previous = previous;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public Linkitem getNext() {
return next;
}
public void setNext(Linkitem next) {
this.next = next;
}
}
*****************************************************
//LinklistTest.java
import java.util.ArrayList;
public class LinklistTest {
public static void main(String[] args) {
//初始化链表项
Linkitem a = new Linkitem(null, "a", null);
Linkitem b = new Linkitem(null, "b", null);
Linkitem c = new Linkitem(null, "c", null);
Linkitem d = new Linkitem(null, "d", null);
a.setPrevious(d);
a.setNext(b);
b.setPrevious(a);
b.setNext(c);
c.setPrevious(b);
c.setNext(d);
d.setPrevious(c);
d.setNext(a);
//新建存放链表的数组列表
ArrayListLinkitem list = new ArrayListLinkitem();
//添加个链表项
list.add(a);
list.add(b);
list.add(c);
list.add(d);
//是否为循环链表的判断变量
boolean link = false;
Linkitem start = a;
Linkitem current = a;
//判断循环链表
for (int i = 0; i list.size(); i++) {
current = current.next;
if (start.data.equals(current.data)) {
link = true;
}
}
//输出
if (link == true) {
System.out.println("此链表为循环链表。");
} else {
System.out.println("此链表不是循环链表。");
}
}
}
*****************************************************
运行结果为:
此链表为循环链表。
关于java链表是否有环和java 链表的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
