《Java数据结构》--单链表详解

一.单链表的概念

1.概念

单链表是一种物理存储结构是非连续,非线性的但是在逻辑结构上是连续且线性的,链表是通过一个个结点来实现的,使每个相邻结点之间存在一定关系来将所有结点串起来,在物理存储上像是一条链子。

2.链表的原理

刚刚有说链表是通过结点之间的关系串起整个链表,那么具体是什么关系呢?🤔往下看:

单链表的每个结点分成两部分分别是储存数值域(val)和下一个结点的地址域(next),每个结点都储存这下一个结点的地址,这样是不是就可通过上一个结点找到下一个结点了一次类推就把整个链表连起来了。

接下来我们通过画图来具现化这个链表:

二.单链表的实现

1.单链表的创建

既然每一个结点都是一个引用类型,那么我们就可以定义一个内部类来创建结点。然后我们需要定义一个头节点,这个结点是整个链表的第一个结点,我们可以通过头节点来访问到链表中的每一个节点。链表不像顺序表可以随机下标访问,他只能通过都节点一点点遍历找到目标结点。

//node.next就可以找到下一个结点🥰

2.打印链表

我们要打印链表,首先肯定要遍历链表,刚刚说要通过头节点来找到后面节点,那是不是直接一直head = head.next就行?这样可以完成遍历可是头节点变成了最后一个结点,还怎么找到链表的头呢,所有我们定义一个中间变量 cur = head,然后让cur代替 head向后遍历。

3.尾插

首先创建一个新结点,通过cur遍历到最后一个结点,让最后一个结点连上新节点(cur.next = node)

//记得不要忘记判断链表是否为空哦!!!

4.头插

创建一个新节点,让新节点的下一个为head(node1.next = head)然后把新结点当作头结点

5.指定位置插入

通过cur遍历到指定位置然后插入新节点就行,不过该怎么插呢直接让cur的下一个等于新结点吗?这样的化就找不到后面的结点了,所以这里让新节点的next等于cur的next,然后再让cur的next,等于新结点。这里我画一个图来帮助你理解:

//记得判空哦!!

//如果要插入的位置是头部或者尾部直接头插或者尾插就行

6.获取链表长度

记录遍历了多少个结点就行

7.头删

将头结点置为下一个

8.尾删

遍历到倒数第二个位置然后将他的next置为null

//记得判空,如果链表只有一个结点那么我们可以直接调用刚刚的头删方法

9.指定位置删

先找到要删除的结点的前一个结点,然后直接让这个结点直接指向要删除的结点的后一个结点

//要先判断位置是否合法,和之前一样如果是头部或尾部直接头删尾删就行

10.删除指定数据val

一一遍历链表直到找到val为止(判断条件不能是cur.val != null,不然会越界)

//因为无法判断到头结点位置所有要单独判断

11.删除所有val

遍历数组找到所有val然后删除

//注意,这里必须要在遍历完了之后再判断头结点,否则如果头结点是val的话,进行头删第二个结点就会遍历不到;

12.清空链表

这个应该不用我多说了吗,嘿嘿!!😉

13.修改指定位置的数据val

到这里我想你应该已经对链表比较熟悉了吧,试着自己去实现一下把!🙉😋

三.和顺序表的对比

顺序表的优缺点:

优点:存储空间连续方便下标随机储存

缺点:头插或者中间插入数据要挪动后面数据,效率低下

链表优缺点:

优点:随用随分配内存,易于插入和删除

缺点:遍历困难,不易查找复杂度为o(N)

我们可以看到顺序表和链表的优缺点似乎是互补的

到这里链表就已经聊完了,小编这里只是实现了一个单链表,还有双链表,带头链表,循环链表等感兴趣的话可以自己去了解一下,核心思想都差不多

如果想要练习一些题,欢迎关注博主的刷题博客哦!最后如果有不懂的或者其他间接欢迎在下方评论或私信博主,谢谢你的阅读,也希望可以支持一下博主!!🥰🥰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/651597.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Ai企业知识库》-rasa X安装使用

背景: Rasa X 是一个为构建、改进和管理对话式AI助手而设计的工具。它是Rasa开源机器学习框架的一个扩展,旨在实现“对话驱动开发”(Conversation-Driven Development)。Rasa X 主要特点包括: 交互式学习:…

二叉树的实现(递归实现)

前言:本文讲解通过递归的方式实现二叉树的一些基本接口。 目录 通过左右子树的方式实现二叉树: 二叉树的遍历: 求二叉树结点的个数: 二叉树所有节点的个数: 二叉树叶子节点的个数: 求第k层节点的节点…

传输层安全性 (TLS)

传输层安全 (TLS) 旨在提供传输层的安全性。TLS 源自称为安全套接字层 (SSL)的安全协议。 TLS 确保任何第三方都无法窃听或篡改任何消息。 TLS 有几个好处: ● 加密: TLS/SSL 可以帮助使用加密来保护传输的数据。 ● 互操作性: TLS/S…

PHP框架 Laravel

现在因为公司需求,需要新开一个Laravel框架的项目,毫无疑问,我又被借调过去了,最近老是被借调,有点阴郁,不过反观来看,这也是好事,又可以复习和巩固一下自己的知识点,接下…

第八大奇迹

目录 题目描述 输入描述 输出描述 输入输出样例 示例 输入 输出 运行限制 原题链接 代码思路 题目描述 在一条 R 河流域,繁衍着一个古老的名族 Z。他们世代沿河而居,也在河边发展出了璀璨的文明。 Z 族在 R 河沿岸修建了很多建筑&#xff0c…

[Algorithm][动态规划][简单多状态DP问题][买卖股票的最佳时机 III][买卖股票的最佳时机 Ⅳ]详细讲解

目录 1.买卖股票的最佳时机 III1.题目链接2.算法原理详解3.代码实现 2.买卖股票的最佳时机 IV1.题目链接2.算法原理详解3.代码实现 1.买卖股票的最佳时机 III 1.题目链接 买卖股票的最佳时机 III 2.算法原理详解 注意:本题为了便于初始化,有较多细节服…

Java之Writer类:探索Java中的输出流

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

在CentOS 8上卸载与安装MySQL 8的详细步骤

关键词:MySQL 8安装、CentOS 8、YUM源配置、卸载MySQL、MySQL残留文件删除、首次登录MySQL临时密码、服务状态检查、MySQL社区服务器 阅读建议:本文适合需要在CentOS 8操作系统上部署最新MySQL 8数据库的系统管理员或开发者阅读。文中步骤简洁清晰&#…

Spring+SpringBoot面试总结(近两万字)

SpringSpringBoot面试总结 一、Spring Bean1.1、bean的生命周期(对象的创建使用销毁)1.1.1、准备工作1.1.2、创建Bean对象1.1.3、注册销毁 1.2、 bean的作用域1.2.1、配置方式 1.3、 spring 自动装配 bean 有哪些方式(存疑存疑)1.…

452. 用最少数量的箭引爆气球(中等)

452. 用最少数量的箭引爆气球 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转:452. 用最少数量的箭引爆气球 2.详细题解 引爆所有气球,弓箭数要最少,那么每支弓箭尽量多的引爆气球,采用贪心策略。对于…

基于小波熵阈值的心电信号R波检测算法(MATLAB)

心脏兴奋电活动过程可由心电信号(ECG)来反映,心电信号也是医学上对心血管疾病诊断的重要科学依据。心电信号具有一定的随机性且一般情况下十分微弱,在信号采集、放大及变换过程中,心电信号容易受到人体呼吸及检测仪器等因素影响,从…

在ARM开发板上,栈大小设置为2MB(常用设置)里面存放的数据

系列文章目录 在ARM开发板上,栈大小设置为2MB(常用设置)里面存放的数据 在ARM开发板上,栈大小设置为2MB(常用设置)里面存放的数据 系列文章目录 在ARM开发板上,栈(Stack)…

linux下cp和mv命令显示进度条

1.查看当前系统下coreutils工具包的版本号: [rootk8s-master ~]# rpm -qa | grep -w coreutils coreutils-8.22-24.el7_9.2.x86_64当前版本为8.22。 因为cp 和 mv 命令由 coreutils 软件包提供,所以需要重新下载 coreutils 软件包配置补丁 2.下载core…

148.栈与队列:前K个高频元素(力扣)

代码解决 class Solution { public:// 自定义比较类,用于优先队列(小顶堆)class mycomparison{public:// 重载操作符,用于比较两个pair,基于pair的第二个值(频率)bool operator()(const pair&l…

网页图片加载慢的求解指南

网页/图片加载慢的求解指南 一、前言与问题描述 今天刚换上华为的HUAWEI AX3 Pro New,连上WIFI后测速虽然比平时慢,但是也不算太离谱,如下图所示: 估计读者们有也和作者一样,还没意识到事情的严重性😁。 …

UE_地编教程_创建地形洞材质

个人学习笔记,不喜勿喷。侵权立删! 使用地形洞材质来遮罩地形上特定位置的可视性和碰撞。如要在山脉侧面创建进入洞穴的入口,此操作将非常有用。可使用地形材质和地形洞材质的相同材质,但注意:对比不使用不透明蒙版的…

基于Cloudflare/CloudDNS/GitHub使用免费域名部署NewBing的AI服务

部署前准备: Cloudflare 账号 https://dash.cloudflare.com/login CloudDNS 账号 https://www.cloudns.net/ GitHub 账号 https://github.com/Harry-zklcdc/go-proxy-bingai Cloudflare 部署 Worker CloudDNS 获取免费二级域名 GitHub New Bing Ai 项目 https://git…

Linux系统硬盘分区

文章目录 一、硬盘和分区1.1 硬盘的概念1.2 硬盘分区的类别1.3 硬盘分区的方式1.3.1 MBR分区1.3.2 GPT分区 1.4 硬盘分区的意义1.4.1 分区的作用1.4.2 分区的缺点 二、如何建立分区2.1 分区命令2.1.1 fdisk命令2.1.2 gdisk命令 2.2 建立分区2.2.1 建立MBR分区建立主分区建立扩展…

电脑如何在网页上下载视频 浏览器如何下载网页视频

对于现代职场人士而言,在日常生活中难免需要下载各种短视频,IDM下载加速器可以轻松获取抖音、快手等平台的无水印短视频文件。 Internet Download Manager,简称IDM。功能强大的网络下载器。您不需要多余的操作,IDM 能捕获您的下载…

实战

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 实战一:模拟支付宝蚂蚁森林的能量产生过程 支付宝的蚂蚁森林通过日常的走步、生活缴费、线下支付、网络购票、共享单车等低碳、环保行为…