数据结构和算法-单链表的基本介绍|学习笔记

简介: 快速学习数据结构和算法-单链表的基本介绍

开发者学堂课程【Go 语言核心编程 - 数据结构和算法:数据结构和算法-单链表的基本介绍】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/627/detail/9835


数据结构和算法-单链表的基本介绍


 容简介:

一、链表的介绍

二、单链表的介绍

三、小结


一、链表的介绍

(1)前言

上一节讲了用数组来模拟一个环形的队列,它的核心思想就是指针或者标识元素的下标,在到达队尾的时候,它可以通过取模的方式,又重新回到这个数组的前面,这是核心思想。下面来看另外一种数据结构,这个数据结构是非常有用的,为什么说这个数据结构更有用?或者更有意思?

因为这个链表,它可以实现前面的队列在前面讲 redit 的时候,曾经有一个数据结构叫 list ,那个 list 底层可以用数组实现,也可用链表实现,它这个就很灵活了。数据结构可以做很多好玩的东西出来

(2)链表的基本介绍及示意图

首先链表是什么,链表是有序的一个列表。它在内存中的存储是如下图所示:

image.png

有头指针,指向了后面的各个结点结点之间是可以这样互相指,对于我们来说,感觉并不是完全连续的,这个很正常,因为它下面地址的分布其实还是由系统来决定的,这个并不影响因为认为都是有序的就行,这是它一个基本的说明。


二、单链表的介绍

(1)单链表(带头结点)逻辑示意图

单链表(带头结点)逻辑示意图如下所示:

image.png

最左边是一个 head 结点先指向一个头结点头结点里面有一个字段这个字段又指向另外一个节点另外一个节点里面又有一个字段,它又向指向另外节点

(2)经典案例示意图介绍

一个示意图最经典的案例,如下:

image.png

有一个头结点 head 的节点它指向了一个头结点比如说这是第一个结点,那这个结点里面是什么内容?比如是一个人,Person ,假设它有个字段名字叫 tom ,另外它有一个叫 next 是一个什么类型?

姑且认为它是一个 next[ *Person] 的类型,假定左上角节点它的结构体是 type people struct ,它里面首先有它自己的信息,比如 name string ,另外一个最重要的信息就是 next 的指针,即 next[ *Person] ,假设还有一结点 jack假设还有一个结点 Scott ,再来一个头结点,头结点没有具体的数据,只专门用来做头结点,里面的内容可以不给任何东西,然后形成一个结构,可以看到它的头结点指向地方然后下边地方继续指向的下一个结点,以此类推,于是这样它就形成了一个链表的结构,那么链表它形成的意义有什么用?

可以想象在现实生活中就会存在这样类似的结构,比如小朋友围成一圈丢手帕,就可以形成一个环状的,怎么样一个环状呢?

既可以再重新回来不要再重新指向这个头结点这样就是一个环状,那如果不想做环状的列表,它本身其实看起来也像是一个队列也就可以当一个队列来使用它更有意思的是,它可以在内存里面形成一些非常有用的结构,

比如下图:

image.png

比如上图是有一组人,那么可以让多人形成一个哈希,到时候在帮某一组人的时候,通过一个里面有另外一个结构,可以很轻松的通过这个结点来找到主人所以说这个非常有用的,上图是它的一个示意图

(3)改进的链表示意图

那么我这个图,画的有一点点不准确,这个图如果在 Java 或者 C++ 里面,它是一个很精准的图,但是放在 Go 语言里面,有点不准确,哪一点不准确?

就是因为都非常清楚的知道,在 Go 语言里面这个结构体它本身是一个指针类型所以  next 这个指针准确的讲,并没有直接指向下一个结构体,它其实直接指向的是一个地址以前讲过,它是指针的话是先指向一个地址指向真正的结构体,也就是说标准的画法应该是如下图所示:

 image.png

有时候这样画的很麻烦,看起来不舒服,所以说在讲课的时候,可能把中间这个地址就不了,这个就是一个链表的一个最基本的结构。

(4)链表的增删改查

来完成对链表的增删改查通过练习,就能知道链表它是怎么用的,可以这样理解可以利用链表来做一个属于自己的内存数据库就是有些时候我们往往把数据直接放在数据库里面,但是是人家的东西有些时候想自己去存放一个数据量比较大的数据数量比较大而且还要让具有很好的扩展性,比如还在内存里面存放数据,有增删改查的功能,这个时候链表加上哈希,即链表配合哈希的算法,就是非常不错的一种机构

所以这就是为什么后边再讲的有一个闪列,闪列加上散列它本身就是一个哈希,然后配合链表,就相当于自己可以做一个小的内存的数据管理的一个机制,那是不是意味着将来自己想去搞一点数据,自己在里面把它维护起来,有增删改查功能就可以了,就这个意思必须学会链表,看起来它虽然不是很难,但是它很有用


三、小结

链表是一个有序的列表,它在内存中的存储可能不是连续的,但是在形式上体现出来肯定必须是一个有序的,在上文中画了一个图

单链表一般来讲会带一个表头,因为一般来说为了比较容易控制链表一般来讲,为了比较容易控制列表,一般都有表头,比较好的链表增删改查的操作都会给设置一个头结点,头结点主要是用来表示是链表的头它本身并不存放数据,头结点的价值或者作用主要是用来标识链表的头这个是不能动的,一旦头结点没有了,那就完全找不到了节点本身不存放数据

相关文章
|
6天前
|
机器学习/深度学习 算法 Java
[算法与数据结构] 谈谈线性查找法~
该文章详细介绍了线性查找法的基本概念与实现方法,通过Java代码示例解释了如何在一个数组中查找特定元素,并分析了该算法的时间复杂度。
|
8天前
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
|
2月前
|
算法
【初阶数据结构】复杂度算法题篇
该方法基于如下的事实:当我们将数组的元素向右移动 k 次后,尾部 kmodn 个元素会移动至数组头部,其余元素向后移动 kmodn 个位置。
|
2月前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
50 2
|
2月前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
|
2月前
|
算法 索引
【初阶数据结构篇】单链表算法题进阶
深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。
|
2月前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
2天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
1月前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
1月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
下一篇
无影云桌面