问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Java语言没有指针,怎样实现链表?

发布网友 发布时间:2022-04-21 05:24

我来回答

1个回答

热心网友 时间:2023-11-06 00:52

Java语言中的对象引用实际上是一个指针(这里的指针均为概念上的意义,而非语言提供的数据类型),所以我们可以编写这样的类来实现链表中的结点。
程序代码:

class Node 

Object data; 
Node next;//指向下一个结点 
}

将数据域定义成Object类是因为Object类是广义超类,任何类对象都可以给其赋值,增加了代码的通用性。为了使链表可以被访问还需要定义一个表头,表头必须包含指向第一个结点的指针和指向当前结点的指针。为了便于在链表尾部增加结点,还可以增加一指向链表尾部的指针,另外还可以用一个域来表示链表的大小,当调用者想得到链表的大小时,不必遍历整个链表。
链表的数据结构我们可以用类List来实现链表结构,用变量Head、Tail、Length、Pointer来实现表头。存储当前结点的指针时有一定的技巧,Pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点,因为当删除当前结点后仍需保证剩下的结点构成链表,如果Pointer指向当前结点,则会给操作带来很大困难。如何得到当前结点呢?我们定义了一个方法cursor(),返回值是指向当前结点的指针。类List还定义了一些方法来实现对链表的基本操作,通过运用这些基本操作我们可以对链表进行各种操作。例如reset()方法使第一个结点成为当前结点。insert(Objectd)方法在当前结点前插入一个结点,并使其成为当前结点。remove()方法删除当前结点同时返回其内容,并使其后继结点成为当前结点,如果删除的是最后一个结点,则第一个结点变为当前结点。
链表类List的源代码如下:

package  cn.javatx; import  java.io.IOException;/**
*  @author  ljfan
*  
*/
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.out.println("You  can  press  return  to  quitn");
try  {
System.in.read();
}  catch  (IOException  e)  {
}
}
}class  Node  {
Object  data;
Node  next;Node(Object  d)  {
data  =  d;
next  =  null;
}
}

当然,双向链表基本操作的实现略有不同。链表和双向链表的实现方法,也可以用在堆栈和队列的现实中。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
笔记本电脑的哪些牌子什么牌子的笔记本电脑好 笔记本电脑品牌质量排行榜你知道哪个最耐用全面解析笔记本电脑品牌的质 ... 十大笔记本电脑品牌笔记本电脑推荐品牌 各大汽车电脑品牌厂家官方售后服务电话合辑v3.00 哪种笔记本电脑售后好哪个品牌电脑售后好 各大笔记本电脑品牌售后网点及售后电话汇总解决您笔记本电脑问题的选 ... 如何教育孩子成学霸 学霸的家长是怎样培养孩子的? 聪明的懒孩子怎么变成学霸 学霸孩子怎么培养 淡水百鲳鱼和螃蟹一起混养吗? 观赏虾,观赏鱼,观赏螺,观赏贝,蝾螈,鳌虾,螃蟹这些那些可以混养,那些不能混养? 龙鱼能否和螃蟹混养 螃蟹和柳根鱼能混养不? 龙虾大闸蟹可不可以和草鱼鲫鱼黄颡鱼混养要注意什么? 螃蟹鱼混养技术 螃蟹能和鱼放在一起养吗? 螃蟹和桂花鱼能混养吗? 海鲜池螃蟹和什么鱼可以混养 孔雀鱼可以和螃蟹一起养么 螃蟹和鱼能一起养吗 螃蟹能和金鱼混养吗? 鱼和螃蟹能一起养吗 小螃蟹和金鱼能不能养一起 螃蟹喂什么鱼最好? 膏蟹的养殖办法? 螃蟹可以和什么鱼一起养? 螃蟹可以和什么鱼起养 IDC机房运维管理理念和模式 上海世纪互联IDC运维服务包括哪些? java中标识符的使用问题 JAVA环境变量设置不成功, JAVA_HOME G:\jdk-7u7 java中 paint(Graphics g)调用不成功,求高人指点!! JAVA中如何在main()函数中调用paint(Graphics g)函数 关于java.awt.Graphics g问题 java配置JKD时候,默认安装路径是C:&#92;Program Files&#92;Java&#92;Jdk1.6.0&#92;bin; 运行后出现Error : Invalid path, &#92;bin&#92;javac.exe -classpath E:&#92;java -d E:&#92;java E:&#92;java&#92;ss.java ??? java如何画虚线 怎样把银行的钱转到微信里面? 小米智能摄像头防水吗 小米大方摄像头防水吗?室外可以用吗? 小米运动摄像机可以防水吗?(是否必要防水外壳?) 小米摄像头可以冬天放室外吗 小米运动摄像头防水? 小米智能摄像机云台版Pro能在家门口链接WiFi用吗? 小米Max2后置摄像头防水吗?防水性好不好? 哪个牌子的室外摄像机防水效果好? 小米Max2后置摄像头防水吗? 小米看家摄像机。这个按键是什么意思呢? 小米发布室外摄像机电池版,到手价仅349元,值得入手吗?