java实现链表

article/2025/10/12 20:36:40

一、链表定义

链表通过指针将一组零散的内存块串联在一起进行使用。
数据格式:
在这里插入图片描述
根据上面的图展示,每个内存块可以称为链条的一个“结点”,结点包含了数据和下一个结点的地址;同时有2个结点特殊:第一个结点和最后一个结点,第一个结点称为“头节点”,存储链表基地址,最后一个结点称为“尾节点”,尾节点的下一个结点为空地址 NULL。

二、链表实现定义

public class LinkList<T> {//结点定义private class Node{//数据T item;//指向下一个结点Node next;//构造器public Node(T item,Node next){this.item = item;this.next = next;}public Node(T item){this.item = item;}}//头结点private Node head;//尾结点private Node tail;//结点个数private int size;//链表定义public LinkList(){this.head = new Node(null,null);size = 0;}}

三、查找特定位置的链表结点

//查找特定位置的链表结点public Node get(int index) {if (index <0 || index >=this.size){return null;}else{Node temp = this.head;for(int i =1;i<=index;i++){temp = temp.next;}return temp;}}

四、插入链表结点

在这里插入图片描述
注意:
将结点 x 的 next 指针指向结点 b,再把结点 a 的 next 指针指向结点 x,这样才不会丢失指针,导致内存泄漏。

//在链表的第i个位置插入一个值为t数据public void insert(int index ,T data) throws Exception{if(index <0 ||index > this.size){throw new Exception("插入超出范围");}else{Node newNode = new Node(data);//在头结点插入元素if (index ==0){if(this.size >0){Node temp = head;newNode.next = temp;}head = newNode;}//在尾结点插入元素else if(index == this.size){Node temp = tail;temp.next = newNode;this.tail  = newNode;}else{//在中间插入元素Node preNode = get(index-1);Node nextNode = preNode.next;newNode.next = nextNode;preNode.next = newNode;}}this.size ++;if(size == 1){tail = head;}}

五、删除链表结点

//删除特定位置的数据public void del(int index )throws Exception{if (index <0 ||index >=this.size){throw new Exception("删除超出范围");}else{//删除头结点if (index == 0){Node temp = this.head.next;this.head = temp;}else if(index == this.size-1){    //删除尾结点Node preNode = get(index -1);this.tail = preNode;preNode.next = null;}else{//删除中间结点Node preNode = get(index -1);Node nextNode = preNode.next.next;preNode.next = nextNode;}}this.size --;}

六、整体代码

public class LinkList<T> {//结点定义private class Node{//数据T item;//指向下一个结点Node next;//构造器public Node(T item,Node next){this.item = item;this.next = next;}public Node(T item){this.item = item;}}//头结点private Node head;//尾结点private Node tail;//结点个数private int size;//链表定义public LinkList(){this.head = new Node(null,null);size = 0;}//查找特定位置的链表结点public Node get(int index) {if (index <0 || index >=this.size){return null;}else{Node temp = this.head;for(int i =1;i<=index;i++){temp = temp.next;}return temp;}}public void add(T data){Node temp = new Node(data);//链表为空时if (this.size == 0){head = temp;tail = head;}else{Node last  =  tail;last.next = temp;this.tail = temp;}this.size ++;}//在链表的第i个位置插入一个值为t数据public void insert(int index ,T data) throws Exception{if(index <0 ||index > this.size){throw new Exception("插入超出范围");}else{Node newNode = new Node(data);//在头结点插入元素if (index ==0){if(this.size >0){Node temp = head;newNode.next = temp;}head = newNode;}//在尾结点插入元素else if(index == this.size){Node temp = tail;temp.next = newNode;this.tail  = newNode;}else{//在中间插入元素Node preNode = get(index-1);Node nextNode = preNode.next;newNode.next = nextNode;preNode.next = newNode;}}this.size ++;if(size == 1){tail = head;}}//删除特定位置的数据public void del(int index )throws Exception{if (index <0 ||index >=this.size){throw new Exception("删除超出范围");}else{//删除头结点if (index == 0){Node temp = this.head.next;this.head = temp;}else if(index == this.size-1){    //删除尾结点Node preNode = get(index -1);this.tail = preNode;preNode.next = null;}else{//删除中间结点Node preNode = get(index -1);Node nextNode = preNode.next.next;preNode.next = nextNode;}}this.size --;}//移除末尾元素,并返回对应数据public T remove() throws Exception{if (this.size ==0){throw new Exception("链表为空,无法移除");}//只有一个元素,移除后为空if (this.size == 1){T data = this.head.item;this.head = null;this.tail = this.head;this.size --;return data;}else{Node preNode = get(this.size-2);T data  = this.tail.item;preNode.next = null;this.tail = preNode;this.size --;return data;}}//删除特定元素的第一个位置public boolean deleteData(T data){boolean flag = false;if(this.size == 0){return flag;}else{Node curNode = this.head;//元素位于第一个结点if (curNode.item == data){Node nextNode = curNode.next;head = nextNode;flag = true;//当前列表只有一个结点if (this.size ==1){tail = head;}this.size --;}else {while (curNode != null) {Node nextNode = curNode.next;if (nextNode != null && nextNode.item == data) {//删除元素为尾结点if (nextNode.next ==null){this.tail = curNode;curNode.next = null;}else{//删除结点为中间结点Node temp = curNode.next.next;curNode.next = temp;}flag = true;this.size --;break;}curNode = curNode.next;}}}return flag;}public void printLinkList(){if(this.size ==0){System.out.println("链表为空");}else {Node temp = head;System.out.print("目前的列表,头结点:" + head.item + ",尾结点:" + tail.item + ",整体:");while (temp != null) {System.out.print(temp.item + ",");temp = temp.next;}System.out.println();}}public static void main(String args[]) throws Exception {LinkList linkList = new LinkList();linkList.add("2");linkList.del(0);linkList.printLinkList();linkList.insert(0,"a");System.out.println("删除的元素为:"+linkList.remove());linkList.insert(0,"2");linkList.insert(1,"3");linkList.add("3");linkList.printLinkList();linkList.del(1);linkList.printLinkList();linkList.insert(1,"1");linkList.insert(0,"0");linkList.insert(2,"0");linkList.del(2);linkList.printLinkList();linkList.deleteData(3);linkList.printLinkList();}}

http://chatgpt.dhexx.cn/article/IppkmF3D.shtml

相关文章

redis实现延迟队列

前言&#xff1a;redis实现延迟队列该怎么做&#xff1f;在这里我分享一下 redis实现延迟队列 一、Redis实现延迟队列二、redis失效监听事件三、此种实现面临的问题四、开发准备五、基础实现六、使用redisson实现延迟队列七、redisson实现延迟队列的原理八、延迟队列配置九、疑…

如何设置时间格式

如何设置时间格式 开发工具与关键技术&#xff1a;VisualStudio C# 作者&#xff1a;落白 撰写时间&#xff1a;2019/06/26时间格式的转换是一个令人头疼的存在&#xff0c;格式稍微出了一点差错就保存不进数据库&#xff0c;或者在类型为时间类型的input标签中显示不出来。搞…

html如何修改时间,html怎么设置时间

html设置时间的方法&#xff1a;首先创建一个div&#xff1b;然后给该div添加一个class属性&#xff1b;最后通过“function realSysTime(clock){...}”方法设置时间即可。 本文操作环境&#xff1a;windows7系统、HTML5&&CSS3版、Dell G3电脑。 HTML设置一个当前时间s…

心跳检测时间设置

Eureka Client 向 Eureka Server 发送心跳的频率&#xff08;默认 30 秒&#xff09; client eureka:instance:# 如果x秒内&#xff0c;依然没有收到续约请求&#xff0c;判定服务过期,默认90slease-expiration-duration-in-seconds: 50# 每隔x秒钟&#xff0c;向服务中心发送…

window下时间设置

用了蛮长时间搞出点东西&#xff0c;还被上面鄙视了一番&#xff0c;算了不抱怨了&#xff0c;在鄙视中成长&#xff0c;在鄙视中强大。 我主要是完成两个两个功能:第一个是设置系统时间将其转换成十六进制精确到分钟显示出来&#xff08;这个VC中有现成的api&#xff0c;以前…

Date、Time、DateTimes设置

撰写时间&#xff1a;2019年06月16日 在数据库中设置的Date、Time、datetime类型&#xff0c;在Vs中Date、datetime便会自动转化为DataTIme类型&#xff0c;而Time类型则会转化为TimeSpan类型 常常在查出时间、日期的数据时都会乱码&#xff0c;就像下图一样&#xff0c;那么…

如何更改Windows服务器时间

Windows操作系统自带时间同步功能&#xff0c;它会自动从互联网时间服务器获取时间&#xff0c;以保证系统时间的准确性。但是&#xff0c;有时候我们需要更改时间服务器&#xff0c;以获得更准确的时间同步。小编将为大家介绍如何更改Windows时间服务器&#xff0c;以及Window…

Windows将时间设置到秒的方法

使用win10系统的用户应该都发现了&#xff0c;Win10系统右下角时间只显示到分&#xff0c;不会显示到秒&#xff0c;如果想要看到秒的话&#xff0c;需要点击一下时间才会弹出。那么&#xff0c;Win10系统时间怎么显示到秒? 默认情况下&#xff0c;需要点击后方可查看时间详情…

设置linux的时间

目录 一、什么是时间 &#xff08;1&#xff09;例子1 &#xff08;2&#xff09;例子2 二、什么是本地时间 三、linux设置本地时间的方法 &#xff08;1&#xff09;方式一&#xff1a;通过互联网自动同步 1.修改时间同步服务器 2.查看时间同步情况 &#xff08;2&…

win10电脑时间同步设置方法

win10系统的时间与日期默认是跟网络时间同步的&#xff0c;这样可以保持电脑时间的准确。不过有网友反映自己的win10电脑时间不对&#xff0c;调准时间后过段时间又是如此&#xff0c;不知道如何设置win10电脑时间同步。下面小编就教下大家win10电脑时间同步设置方法。 具体的…

简单3招教你设置电脑时间

案例&#xff1a;电脑时间怎么设置&#xff1f; 【我使用电脑时&#xff0c;电脑显示的时间一直不对&#xff0c;这导致我非常不方便&#xff0c;想问下大家平常使用电脑时有什么设置电脑时间比较简单的方法吗&#xff1f;】 电脑的时间设置很重要&#xff0c;不仅可以保证电…

超越函数e^(-x^2)收敛

超越函数e(-x2)收敛 Γ ( z ) ∫ 0 ∞ e − x 2 d t . \Gamma(z) \int_0^\infty e^{-x^2}dt\,. Γ(z)∫0∞​e−x2dt. 原函数不能直接积分所以采用极坐标变换的方式求解&#xff0c;本人自用码住

积分抵现

积分抵现设置教程 积分抵现 积分抵现包括积分抵现比率、是否开启积分抵现和积分说明。 其中&#xff0c;积分抵现比率为 1积分可抵多少元现金 转载于:https://my.oschina.net/u/4103048/blog/3099967

常见不可积积分

from sympy import * x symbols(x) a sin(x)/x b exp(x**2) c cos(x)/x d sin(x**2) e cos(x**2) f x/ln(x) g ln(x)/(x1) A integrate(a,x) # Si(x)-->超越函数 B integrate(b,x) # sqrt(pi)*erfi(x)/2-->erfi(x)误差函数 C integrate(c,x) # -log…

超越函数e^(-x^2)在(-∞, +∞)上的定积分的两种解法

令 解法一 二重积分极坐标 故 解法二 Γ函数余元公式 又由余元公式&#xff0c;有 于是 故

加速度计求二次积分

我是勤劳的搬运工&#xff1a;https://blog.csdn.net/u011006622/article/details/56286833 摘要 此文档描述并使用MMA7260QT三轴加速计和低功耗的9S08QG8八位单片机实现求解位置的算法 。 在今天先进的电子市场&#xff0c;有不少增加了许多特性和智能的多功能的产品。定…

python绘制积分函数_Python超越函数积分运算以及绘图实现代码

编译环境&#xff1a;ubuntu17.04 Python3.5 所需库&#xff1a;numpy、scipy、matplotlib 下面是理想平面的辐射强度计算(课程大作业&#xff5e;&#xff5e;&#xff5e;) 1、超越函数积分运算 def integral(x,c1,c2,T): return ((c1*0.98)/(x**5))*(1/((np.e**(c2/(x*T)))-…

高数 | 【定积分、变限积分】【一元函数积分学李林880】 及 巧解例题

一、定积分的概念、性质及几何意义 巧解&#xff1a;利用奇偶性&#xff0c;快速选出答案。 利用图形帮助解题。 设出具体函数。 二、定积分的计算 1.利用几何意义 2.换元法巧解 3.区间平移 本题也可用用区间再现 4.绝对值符号讨论 三、变上限定积分 三种变限积分形式 四、李…

Python超越函数积分运算以及绘图实现

编译环境&#xff1a;ubuntu17.04 Python3.5 所需库&#xff1a;numpy、scipy、matplotlib 下面是理想平面的辐射强度计算&#xff08;课程大作业&#xff5e;&#xff5e;&#xff5e;&#xff09; 1、超越函数积分运算 def integral(x,c1,c2,T): return ((c1*0.98)/(x**…

巧用二重积分的积分中值定理

二重积分的积分中值定理&#xff0c;对于部分题目来说&#xff0c;例如极限题目&#xff0c;积分证明题的运用十分便捷。 在解决极限问题中&#xff0c;几分钟值定理能大大简化求解过程&#xff0c;在求极限过程中&#xff0c;包含有二重积分的问题一般都是通过逐渐化简求导来解…