Java语言中链表和双向链表的实现-Java基础-Java-编程开发

双向链表的倒置(Java) 用Java实现双向链表的倒置功能:public class CustomLinkedList<E> { Node<E> head; Node<E> tail; int size = 0; /** * 头加 * @param item */ public void add(E item) {... 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

链表是一种重要的数据结构,在程序设计中占有很重要的地位。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类的代码稍加改动即可。

Java实现双向链表详解及代码实践 在数据结构中,双向链表(Double-Ended Linked List),是一种常见的线性数据结构,与单向链表相比,它具备了两个方向的指针,允许操作从任一节点开始,向前(后)遍历到链表的末尾。这种设计让双向链表在插入和删除节点操作中更加灵活,尤其是在不需要从头节点开始遍历的情况下。双向链表的每个节点通常包含三个部分:数据域和两个指针域,其中数据域存储节点数据,而两个指针域分别指向前一个节点和后一个节点。这种结构使得双向链表既可以从头部遍历至尾部,也可以反向遍历。 阅读详情

相关推荐

泛型类集合与双向链表实现项目

本文还有配套的精品资源,点击获取 简介:本课程设计项目主要探讨泛型类在集合中的应用,以及如何实现双向链表这一高级数据结构。泛型类允许集合操作多种数据类型,并保持类型安全。项目将详细介绍双向链表的节点和链表类设计,包括添加、删除、查找节点和获取链表长度等基本操作方法,并且讲解实现集合遍历的技巧。通过实现泛型类集合和双向链表,学生将学习如何在类型安全的前提下存储和处理多种数据类...

weixin_42560991的博客 882

数据结构之双向链表

1、定义节点(以英雄联盟的英雄为例) public int no; // 英雄的编号 public String name; // 英雄的名称 public String nickName; // 英雄的昵称 public HeroNode2 next; // 指向下一个节点 public HeroNode2 pre; // 指向前一个节点 //定义HeroNode2,每个HeroNode2对象就是一个节点 class HeroNode2 { publ...

qq_54658577的博客 299

DATCOM GUI——DATCOM-Tools使用介绍

简介 本工具以1976年美国空军稳定性与操纵性计算程序(USAF STABILITY AND CONTROL DIGITAL DATCOM PROGRAM)为基础进行开发,目的是提供更为简洁方便的外形输入方式,并带有三维绘图与气动特性输出功能。 安装与环境配置 1、 代码以Holy Cows公司提供的DATCOM程序为基础,首先下载其安装包(window,Linux均有)。 2、 安装到你想要的位置,注意不要有中文路径 3、 测试DATCOM是否能够正常运行。复制examples文件夹中的Citation

qq_40800981的博客 1万+

【双向链表】java代码实现

【双向链表】java代码实现,图文详解,带大家去掌握双向链表知识。

程序员良辰 2921

HPE磁盘阵列管理04——MSA事件

本文介绍了HPE MSA存储系统的事件处理机制,重点分析了常见磁盘故障事件及其解决方案。文章首先定义了MSA事件的五个严重级别(严重、错误、警告、信息和解决),然后详细列举了多个典型事件案例(如事件1、3、6、8、172等),包括每种事件的触发条件、对系统的影响以及具体修复步骤。针对磁盘故障场景,文章提供了更换磁盘、重建磁盘组、取消隔离等操作建议,并强调应及时配置备用磁盘以降低数据风险。最后指出更详细的事件说明可参考《MSA事件描述参考指南》,并提供了HPE官方手册下载链接。全文为技术人员处理MSA存储故障

istrangeboy&begin zero的博客 1122

VINS-Fusion实战:从零搭建无人机视觉SLAM系统(附ROS配置全流程)

本文详细介绍了如何从零开始为无人机搭建基于VINS-Fusion的视觉SLAM系统。内容涵盖硬件选型(重点推荐双目相机与IMU搭配)、ROS环境配置、传感器标定、核心参数调优以及实际飞行测试与问题排解全流程,旨在帮助开发者实现稳定、精确的无人机自主定位与导航。

wasm7browser的博客 214

Java双向链表知识点详解

双链表是一种灵活的数据结构,支持双向遍历和高效的插入删除操作。在 Java 中,可以通过自定义节点类和链表类来实现双链表,也可以使用 Java 集合框架中的LinkedList类。双链表适用于需要双向遍历的场景,但需要注意其内存开销较大的缺点。

2301_81549590的博客 755

西电计组实验一 存储器实验

计组实验报告 实验一 存储器实验——FPGA中LPM_ROM定制与读出实验 一.实验目的   1.掌握FPGA中lpm_ROM的设置,作为只读存储器ROM的工作特性和配置方法;   2.用文本编辑器编辑mif文件配置ROM,学习将程序代码以mif格式文件加载于lpm_ROM中;   3.在初始化存储器编辑窗口编辑mif文件配置ROM;   4.验证FPGA中mega_lpm_ROM的功能。 二.实验原理   ALTERA的FPGA中有许多可调用的LPM (Library Parameterized Modu

Polaris的博客 1万+

一步步带你用Java实现双向链表(超详细)

文章目录什么是双向链表属性及方法节点Nodesize数据插入头插法 addFirst(T value)尾插法 addLast(T value)插入到指定下标位置add(int index)数据删除(返回被删除节点存储的值)删除头结点 removeFirst删除尾结点 removeLast删除指定下标节点remove(int index)获取指定下标位置节点的数据 getData(int index)获取链表长度遍历输出print()详细遍历输出清空链表实现细节 上一节说到了单链表,这一节我们来手写一个双向链

you do ,you win 1万+

2016域控服务器迁移,WIN Server2016 域服务器迁移出错

各位大神: 这几天刚安装了一台windows server 2016做域迁移时出现错误:1、默认SYSLOG、NETLOGON共享文件重启后自动取消共享,即使手动打开后依然会出现自动取消2、组策略中编辑策略时出现以下报错 policys.png (19.29 KB)2017-2-7 13:52操作此动作之前可以访问本机的共享(NETLOGON)3、使用DCDIAG检测多个报错:C:\Use...

weixin_31833039的博客 3314

基于matlab目标雷达横截面建模(附源码)

雷达系统依靠目标反射或散射来检测和识别目标。目标反射越强,雷达接收器返回的回波就越大,从而获得更高的信噪比(SNR)和更高的检测可能性。在雷达系统中,从目标反射的能量由雷达横截面(RCS)决定,定义为sigma代表RCS,R是雷达与目标之间的距离,Es是从目标反射的信号的场强,以及Ei是入射到目标上的信号的场强。通常,目标向各个方向散射能量,RCS是入射角,散射角和信号频率的函数。RCS 取决于目标的形状和构建目标的材料。用于RCS的常用单位包括平方米或dBsm。

珞瑜的博客 3085

图解链表 —— JAVA 中的双向链表

1. 双向链表 前面提到了单向链表,单链表的特点是只能从前向后遍历,但是如果我们已知一个节点在链表靠后的位置,这时如果使用单链表效率就会很低,因此引入了双向链表就可以快速的找到靠后的节点。双向链表与单向链表的区别就是它不仅有后继节点,还有前驱节点。这样就既存储了下一个节点的地址,也存储了前一个节点的地址。 2. 双向链表的定义 节点类: class DoubleNode { // 指向前驱节点 DoubleNode prev; // 具体存储的数据

AlinaQ05的博客 5392

uniapp [全端兼容] - 实现全景图Vr 720°全景效果查看预览功能,3D全景图流畅不卡顿渲染+手势拖拽+悬浮工具按钮,uniAPP实现vr看720度全景效果示例代码(H5小程序APP全兼容)

uniapp显示720度全景图,720°全景图显示,在h5中展示720°全景图,浏览全景图,基于uniApp实现vr全景预览,加载全景图,uni-app全景预览插件,UNI-APP实现3D全景图,实现720°全景图展示,uniapp全景视频播放,uniapp项目实现vr720度全景图片预览,在网页上展示760全景图片和视频,全景图场景切换,UNIAPP全景VR图,uniapp加载720全景图_uniapp怎么加载vr图片,uniapp实现vr全景看房,uni-app实现全景效果,加载很慢卡怎么办,实现全景预

🏆 前端领域优质创作者 1万+

双向 列表的实现

双向链表

烽火戏猪侯的博客 569

10年上位机开发踩过的20个坑:C#通信/线程/UI适配避坑指南

通信层:所有通信操作异步化、异常全覆盖,加断线重连+心跳检测,多设备隔离资源;线程层:UI更新必做跨线程判断,共享数据加锁,线程池限流,异常不静默;UI层:适配高分屏/DPI,用布局容器替代固定坐标,多屏场景绑定主屏幕。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 904

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

java中的小技巧!

单链表只能从前往后遍历,如果链表的长度较大,遍历到链表后半部分的时候想要往前查找,就只能回到开头,重新遍历了。   双向链表提供了这个能力,即允许前向遍历,也允许后向遍历整个链表。原因是双向链表的每个节点都有两个指向其他节点的引用。但这也是其缺点,因为在插入、删除的时候需要处理四个链接点的引用, 占用的空间也大了一些。如将头节点和尾节点链接起来,即成为双向循环链表。   下面是java代码:

u013470512的专栏 501

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Kotlin语言的双向链表

双向链表是一种链式数据结构,与单向链表不同,它的节点除了包含指向下一个节点的指针(next),还包含指向前一个节点的指针(prev)。这种双向链接使得我们可以快速地在两侧插入和删除节点,相比于单向链表具有更大的灵活性。双向链表是数据结构中非常实用的一种形式。我们在Kotlin中实现了一个简单的双向链表,并扩展了一些基本功能。在实际应用中,双向链表可以帮助我们更有效地管理数据。尽管它在内存和实现上相比于其他结构有一定的复杂性,但在许多场景中,它的灵活性和高效性使其成为了一个理想的选择。

2501_91439287的博客 801

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java实现双向链表(附带源码)

java实现双向链表(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1040

Simula语言的双向链表

Simula是1960年代初期由挪威计算机科学家Ole-Johan Dahl和Kristen Nygaard开发的程序设计语言。Simula被认为是面向对象编程的先驱,尽管它的功能相较于现代的面向对象语言(如Java、C++等)较为有限。Simula支持类、对象以及继承等基本的面向对象特性,是进行数据结构与算法实现的良好工具。

2501_91439235的博客 613

java基于模板的双向链表(附带源码)

java基于模板的双向链表(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 944

java头插法实现双向链表-尾插法

class DLink{ String data; DLink prev,next;//prev存储前一个节点地址;next存储后一个节点的地址 /** * 创建一个双向链表,返回头地址 * @param len 传输向节点传输数据长度 * @return 返回头地址 */ public DLink cr...

微信公众号:一颗向上的草莓 677

java实现双向链表(MyLinkedList)

/需要判断是否在原来的链表中修改数据,如修改过则该迭代器就失效了,自然不能继续使用。//表示当前有指向元素,在迭代器删除的时候就可以成功。//需要判断是否在原来的链表中修改数据,如修改过则该迭代器就失效了,自然不能继续使用。//表示当前有指向元素,在迭代器删除的时候就可以成功。//删除元素方法,删除元素只需要将被删除元素的前指针和后指针给到后面的节点和前面的节点。//删除元素方法,删除元素只需要将被删除元素的前指针和后指针给到后面的节点和前面的节点。

weixin_64057226的博客 456

java+单向链表+双向链表_java+单向链表+双向链表

java+单向链表+双向链表[2021-02-05 17:16:37]简介:php如何实现链表?2020-07-10php实现链表的方法:首先定义一个节点类,代码为【function __construct($val=null)】;然后实现链表的实现类,代码为【function_construct $this->dummyhead = new Nod】。php实现C语言合并两个有序链表的...

weixin_31125161的博客 324

双向链表专题

介绍了双向链表的结构以及一些常用的方法

2301_81375781的博客 890

C语言创建单链表

单链表 链表节点结构体 struct node { char name[10]; float score; } typedef struct node { struct node; struct node*next; }LinkList; 初始化一个链表 void InitLinkList(LinkList*&L) { L=malloc(sizeof(LinkList))...

BShanj的博客 4万+

数据结构与算法——第四讲:静态链表及双向链表

C/Cpp系列具有指针,使他可以非常容易地操作内存中的地址和数据,虽然如Java,C#等不使用指针,但启用了对象引用机制,某种程度上来说也间接实现了指针的某些作用。但对于一些基层的语言,如更早期的Basic、Fortran等早期高级语言,没有指针的概念,链表如果按照我们之前的说法并没有办法实现。这就是我们接下来三分之一的篇章——静态链表。它解决了在没有指针存在的情况下对静态链表的实现,为什么叫静态?

Mongxin_Chan的博客 1179
上一篇: java克隆详述-Java基础-Java-编程开发
下一篇: 利用Java实现串口全双工通讯-Java基础-Java-编程开发
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值