Java数据结构之单链表详解

作者:rain67 时间:2023-11-04 17:02:20 

目录
  • 一、图示

  • 二、链表的概念及结构

  • 三、单链表的实现

  • 四、完整代码的展示

一、图示

Java数据结构之单链表详解

二、链表的概念及结构

链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:

单向、双向

带头、不带头

循环、非循环

今天,我们实现的是一个 单向 无头 非循环的链表。

下面是此链表的结构组成。

Java数据结构之单链表详解

三、单链表的实现

(1)定义一个节点类型

我们创建一个 ListNode 的类作为节点类型,那么我们如何定义成员属性呢?

通过上面的结构分析,我们需要定义两个成员变量 val --作为该节点的存储的数值, next – 保存下一个节点的地址/引用。

同时定义之后,他们的默认值为 0 ,null ,所以要想赋予这个节点数值,要写一个构造方法去首先保存数值。

Java数据结构之单链表详解

这里我们提供了两个构造方法,一个是实现提供数值的节点,另一个是没有提供数值的节点,方便我们之后使用。

之后我们在 MyListNode 的类中实现单链表的各种方法。

Java数据结构之单链表详解

(2)头插法

Java数据结构之单链表详解

以上述结构为例,这个单链表没有专门的傀儡节点来充当头节点,首个节点就定义为头节点,所以头插法,就是我们定义一个节点,插在这个链表的最前面,作为新的 head。

代码实现:

1.定义一个插入的节点


ListNode cur = new ListNode(2);

Java数据结构之单链表详解

此时我们就创建了一个val 为2 的节点。

2.插在头节点的前面

这里分两种情况,

第一次插入节点

不是第一次插入节点

头插之后的结构:

Java数据结构之单链表详解

代码实现:

Java数据结构之单链表详解

(3)尾插法

和头插法类似,同样插入一个节点,在链表的最后。

Java数据结构之单链表详解

这里插入也分为两种情况

第一次插入节点

不是第一次插入节点

代码实现:

Java数据结构之单链表详解

(4)根据下标插入节点

第一个数据节点为0号下标,任意位置插入节点。

还以上面的链表为例,我们想将新的节点插入到2 号位置

Java数据结构之单链表详解

如果想插到2号位置,我们需要改变原来的 1号位置节点和2号位置节点的相关属性。

思路实现:

  1.先判断传入的 index 下标位置是否合法

  2.如果传入的index==0,头插法

  3.如果传入的index==sizeof(),尾插法

  4.如果 sizeof() > index > 0 在链表中间插入,我们首先要找到 index-1 位置的节点 prev

查找 index-1

Java数据结构之单链表详解

修改 prev节点的属性 以及 新节点的属性


 node.next = prev.next
    prev.next = node;

代码实现过程

Java数据结构之单链表详解

(5)查找关键字

Java数据结构之单链表详解

以上面的链表为例,我们现在要查找这个链表中是否出现 val=20 的节点,如果存在,那么返回true,如果不存在,则返回 false.

遍历链表,走过每一个节点,如果 cur.val == key,则 return ture ,遍历完后还未找到 key,那么return false.

Java数据结构之单链表详解

(6)删除第一次出现的关键字

Java数据结构之单链表详解

思路实现:

Java数据结构之单链表详解

代码实现:

Java数据结构之单链表详解

(7)得到单链表的长度

Java数据结构之单链表详解

(8)单链表打印展示

Java数据结构之单链表详解

不能是this.head.next != null 这样写 最后一个节点是不能被打印的

(9)节点的回收

节点的回收有两种方式:

  1.暴力法

直接将head 置空

  2. 挨个置空

遍历单链表,将每一个节点的next都置为 null.

Java数据结构之单链表详解

四、完整代码的展示

Java数据结构之单链表详解

来源:https://blog.csdn.net/rain67/article/details/116849015

标签:Java,单链表,数据结构
0
投稿

猜你喜欢

  • 简单实现Android应用的启动页

    2022-04-15 14:23:45
  • SpringCloud基本Rest微服务工程搭建过程

    2023-08-28 16:23:29
  • 使用spring框架实现数据库事务处理方式

    2022-03-01 14:38:13
  • 如何在IDE部署springboot项目(有swagger和无swagger都是一样的)到服务器或者虚拟机上的docker

    2023-09-01 00:33:25
  • C#远程发送和接收数据流生成图片的方法

    2021-08-31 00:30:10
  • SpringBoot集成Swagger2的方法

    2023-11-26 13:15:42
  • Java9中对集合类扩展的of方法解析

    2022-06-10 09:49:43
  • SpringBoot yml配置文件读取方法详解

    2022-12-13 18:04:19
  • C#使用listView增删操作实例

    2023-03-25 12:34:52
  • Java二分查找算法实例详解

    2022-07-09 14:33:55
  • JDBC核心技术详解

    2023-12-09 12:22:28
  • elasticsearch数据信息索引操作action support示例分析

    2022-03-18 02:09:07
  • Android RecycleView和线型布局制作聊天布局

    2022-08-01 15:36:56
  • 使用Android studio创建的AIDL编译时找不到自定义类的解决办法

    2023-06-23 10:59:41
  • Spring AOP如何自定义注解实现审计或日志记录(完整代码)

    2022-03-28 02:19:34
  • C#实现XML文件读取

    2023-03-06 13:38:44
  • Java实现评论回复功能的完整步骤

    2023-08-23 20:42:45
  • 利用java实现邮箱群发功能

    2021-07-11 21:55:23
  • 详解基于spring多数据源动态调用及其事务处理

    2023-06-23 14:37:25
  • c# 实现文件上传下载功能的实例代码

    2021-12-10 15:00:30
  • asp之家 软件编程 m.aspxhome.com