链表——笔记理解

wuchangjian2021-11-14 05:49:47编程学习

众所周知,在一个数组中插入或是删除一个元素,都会需要移动后面所有的元素,导致代码的运行效率极低

但是!链表就可以很好的解决这一问题

就这么想吧,链表是一辆火车,链表的表头就是火车头,链表的每一个元素就是火车的一节节车厢,车厢里装的东西就是元素的数据域,每个车厢之间的卡子就是元素的指针

不会吧?不会有人没有见过火车吧?不会吧不会吧?

总之,链表就是元素之间前后依赖,串联而成的

啊,对。链表的元素是不能随机访问的,就像你要从一个车厢到远处的另一个车厢,当然不是跨越一道任意门走过去,你没有这东西,所以,只能一节一节走

除了车头和车尾,其余的每一节车厢前后都只能各连接一节车厢

因此,链表的元素前面和后面不会出现多个元素相连的情况

回顾一下,数组是一种支持随机访问,但不支持任意插入或是删除的数据结构

但是,链表支持在任意位置插入或删除,虽然访问只能挨个来

链表呢,分为两种

单项链表

双向链表

在竞赛中,我们通常开一个固定大小的空间,然后用数组来模拟链表

对于链表来说,每一个元素都需要存储两个信息

本身的数值,和下一个元素编号

用数组模拟一下

int value[5] = {10 , 20 , 30 , 40 , 50}
int next[5]={-1 , -1 , -1 , -1 , -1}

value[i]是它本身存储的数据

naxt[i]是编号为 i 元素的下一个元素编号

一开始全是 -1 表示每个元素都是单独存在的,后面没有连接元素

若是希望将一个元素插入到链表中

比如将value[4]插入到value[1]以后,就可以使用next[1] = 3表示现在 1 后面连接的是 3

此时,这个链表就是 1 —> 3,2 4 单独存在

再把 2 插到 3 后面,即 next[3] = 2

此时这个链表就是 1—> 3 —> 2, 4 单独存在

要是希望插入到两个元素中间,使链表成为 1 —> 4 —> 3 —> 2

最简单的方法当然是直接修改数组

next[1] = 4

next[4] = 3

但是,考虑到普遍性,当然不能这么做

若要插入4 ,其实就是新建两条边,删除一条边,即断开 1 —> 3

新建 1 —> 4 和 4 —> 3

实操可以发现,其实断开 1 —> 3 和新建 1 —> 4 就是同一步操作

因为后面还要建立连接,而建立连接就需要知道其存在

因此,要先从 next[1]中获取 3 的存在,再断开,否则就获取不了了

两步的操作顺序是不能进行变更的,即 next[4] = next[1] 然后 next[1] = 4

插入理解了不?

没理解?

回去再看一遍

理解了就继续

既然插入都理解了,那删除便更好理解了

要是我们想删除 3 号节点,如何?

逻辑上三步,断开 1 —> 3 和 3 —> 2 新建 1 —> 2

同理,删除也是有顺序的,需要先新建 1 —> 2 再断开 3 —>  2 即next[1]  = next[3],然后才是 naxt[3] = 1

如果要删除第一个元素,方法就得进行修改了,怎么修改?自己想吧

好的!我继续,接下来,是链表的遍历

因为我们构造的链表是由 next 连接起来的,因此,对于一个节点,我们只能知道它的下一个节点是谁。那么就好办了,只要记录下链表的第一个元素,便可以遍历整个链表

链表是一种数据结构,并不限制实现方式,或许很多人都想到了,用结构体来表示每一个元素更加的直观与方便。

总之,要是实在不会,就像数学那样,多画画图吧

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。