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

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

开发者学堂课程【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)链表的增删改查

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

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


三、小结

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

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

相关文章
|
3月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
73 1
|
3月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
83 0
|
7月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
189 10
 算法系列之数据结构-二叉树
|
7月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
158 3
 算法系列之数据结构-Huffman树
|
8月前
|
存储 算法 Java
算法系列之递归反转单链表
递归反转链表的基本思路是将当前节点的next指针指向前一个节点,然后递归地对下一个节点进行同样的操作。递归的核心思想是将问题分解为更小的子问题,直到达到基本情况(通常是链表末尾)。
193 5
算法系列之递归反转单链表
|
7月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
196 22
|
6月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
105 0
|
8月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
200 30
|
8月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
313 25
|
8月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
286 23

热门文章

最新文章