中易网

java基本链表

答案:2  悬赏:50  
解决时间 2021-11-08 00:08
class Node{
private Object data ;
private Node next ;
public Node(Object data) {
this.data = data ;
}

public Object getData() {
return this.data ;
}
public void setNext(Node next) {
this.next = next ;
}
public Node getNext() {
return this.next ;
}
}
public class TestDemo1{
public static void main(String args[]) {
Node root = new Node("车头!") ;
Node n1 = new Node("车厢A") ;
Node n2 = new Node("车厢B") ;
root.setNext(n1);
n1.setNext(n2);
Node currentNode = root ;
while(currentNode != null) {
System.out.println(currentNode.getData()) ;
currentNode = currentNode.getNext();

}
}
}
李兴华书的链表
请问root.setNext(n1); n1 传进去的是“车厢A”吗?next = “车厢A”? 使得currentNode = currentNode.getNext(); 为“车厢A”?
最佳答案
实现链表的思路: 1)链表类,结点类(链表类的内部类),在main()方法创建一条链表类对象,通过方法逐步创建结点类,通过引用链接起来成为链表。2)结点类包含数据和对下个结点的引用,以及可以对数据赋值的构造函数。3)链表类的构造方法,只构造出不含数据的头结点。(外部类可以直接对内部类的私有成员进行访问,这样就可以直接修改引用)
全部回答
链表是一种重要的数据结构,在程序设计中占有很重要的地位。c语言和c++语言中是用指针来实现链表结构的,由于java语言不提供指针,所以有人认为在java语言中不能实现链表,其实不然,java语言比c和c++更容易实现链表结构。java语言中的对象引用实际上是一个指针(本文中的指针均为概念上的意义,而非语言提供的数据类型),所以我们可以编写这样的类来实现链表中的结点。 class node { object data; node next;//指向下一个结点 } 将数据域定义成object类是因为object类是广义超类,任何类对象都可以给其赋值,增加了代码的通用性。为了使链表可以被访问还需要定义一个表头,表头必须包含指向第一个结点的指针和指向当前结点的指针。为了便于在链表尾部增加结点,还可以增加一指向链表尾部的指针,另外还可以用一个域来表示链表的大小,当调用者想得到链表的大小时,不必遍历整个链表。下图是这种链表的示意图: 链表的数据结构 我们可以用类list来实现链表结构,用变量head、tail、length、pointer来实现表头。存储当前结点的指针时有一定的技巧,pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点。那么为什么要这样做呢?这是因为当删除当前结点后仍需保证剩下的结点构成链表,如果pointer指向当前结点,则会给操作带来很大困难。那么如何得到当前结点呢,我们定义了一个方法cursor(),返回值是指向当前结点的指针。类list还定义了一些方法来实现对链表的基本操作,通过运用这些基本操作我们可以对链表进行各种操作。例如reset()方法使第一个结点成为当前结点。insert(object d)方法在当前结点前插入一个结点,并使其成为当前结点。remove()方法删除当前结点同时返回其内容,并使其后继结点成为当前结点,如果删除的是最后一个结点,则第一个结点变为当前结点。 链表类list的源代码如下: import java.io.*; public class list { private node head=null; private node tail=null; private node pointer=null; private int length=0; public void deleteall() { head=null; tail=null; pointer=null; length=0; } public void reset() { pointer=null; } public boolean isempty() { return(length==0); } public boolean isend() { if(length==0) throw new java.lang.nullpointerexception(); else if(length==1) return true; else return(cursor()==tail); } public object nextnode() { if(length==1) throw new java.util.nosuchelementexception(); else if(length==0) throw new java.lang.nullpointerexception(); else { node temp=cursor(); pointer=temp; if(temp!=tail) return(temp.next.data); else throw new java.util.nosuchelementexception(); } } public object currentnode() { node temp=cursor(); return temp.data; } public void insert(object d) { node e=new node(d); if(length==0) { tail=e; head=e; } else { node temp=cursor(); e.next=temp; if(pointer==null) head=e; else pointer.next=e; } length++; } public int size() { return (length); } public object remove() { object temp; if(length==0) throw new java.util.nosuchelementexception(); else if(length==1) { temp=head.data; deleteall(); } else { node cur=cursor(); temp=cur.data; if(cur==head) head=cur.next; else if(cur==tail) { pointer.next=null; tail=pointer; reset(); } else pointer.next=cur.next; length--; } return temp; } private node cursor() { if(head==null) throw new java.lang.nullpointerexception(); else if(pointer==null) return head; else return pointer.next; } public static void main(string[] args) { list a=new list (); for(int i=1;i<=10;i++) a.insert(new integer(i)); system.out.println(a.currentnode()); while(!a.isend()) system.out.println(a.nextnode()); a.reset(); while(!a.isend()) { a.remove(); } a.remove(); a.reset(); if(a.isempty()) system.out.println("there is no node in list \n"); system.in.println("you can press return to quit\n"); try { system.in.read(); //确保用户看清程序运行结果 } catch(ioexception e) {} } } class node { object data; node next; node(object d) { data=d; next=null; } } 读者还可以根据实际需要定义新的方法来对链表进行操作。双向链表可以用类似的方法实现只是结点的类增加了一个指向前趋结点的指针。 可以用这样的代码来实现: class node { object data; node next; node previous; node(object d) { data=d; next=null; previous=null; } } 当然,双向链表基本操作的实现略有不同。链表和双向链表的实现方法,也可以用在堆栈和队列的实现中,这里就不再多写了,有兴趣的读者可以将list类的代码稍加改动即可。 如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快! vaela
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
朋友在淘宝买东西申请代付的,我给她付了之后
请问厨房没有窗户装修怎么办?
誓不为人的意思
我今晚想看小说啊!谁给推荐个
大姨妈来了几天算正常?
红酒拉菲空瓶有回收的吗
您好,谢谢您的回答!请问您有那家卖米线机的
京东网上商城为什么买大家电不送货上门啊?还
7公分馒头柳价格多少?
欧诗顿有什么新的产品吗?
bust into和bust out 有什么区别?请详细讲解
电脑发明者是谁
想给宝宝买硅胶奶瓶 请帮助推荐 哪个牌子的性
上海机场4线的五角场站步行至如家五角场店需
求女性购物的QQ群、越多越好。
推荐资讯
福州八中可以留长发吗(齐腰的)
孕酮很低怎么办 孕酮很低怎么办
中天·汇丽华城网球场地址在什么地方,想
安娜苏哪款香水好闻?请按照你的感觉排个顺序
长沙哪个地方的自助餐最好吃?
有源音箱输入没有左右声道插口该咋办?
谁能知道各省12316农业技术人员手机号码?我想
鸡毛菜、小青菜、油菜、青菜、小白菜的区别?
2011年清明节去哪里旅游最适合?
脚底板长了很多水泡怎么能治好
大同哪里有卖哈根达斯的、只在北京吃过、、、
生土豆片能去除黒\眼圈吗
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?