链式存储之:链表的引出及其简介

简介: 链式存储之:链表的引出及其简介

对于这篇博客,算是熬近了笔者的心血,导致最后休息了好几天才缓过来!!既然笔者能写出上篇的文章,那么笔者对于链表,想必也能写出一样优秀的文章,那么就请齿目以待吧!!加油!!


对于顺序表,想必知道的各位老铁已经知道了,不知道的各位老铁再怎么劝说也不一定不知道!!尴尬!!


那么言归正传吧!!


通过上篇博客的学习,对于顺序表,我们可以看出:


顺序表ArrayList:


优点:


当给定下标的时候,查找速度非常块(适合给定下标的查找,时间复杂度为O(1)


缺点:


插入:必须得挪动元素,才能插入(时间复杂度为O(N))


删除:必须得挪动元素,才能删除(时间复杂度为O(N))


扩容:每次的扩容也会浪费资源的(有10个元素,想要放到第11个元素里面,会进行1.5倍扩容,变成15个,但是我们只有11个元素,这就意味着,我们会浪费掉4个空间,……一次类推,当数据越来越大的时候,……因此,每次扩容也是浪费空间的!!


既然顺序表有着那麽多的缺点??那么有没有一种方式,可以减少一点顺序表的缺点呢??因此,链表就可以引出来了!!


链式存储:链表!

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


链表就是跟火车的性质差不多,一个节点一个节点的有序联立起来!!


0a2653c851af460fa595bd959398a8f1.png


链表是由一个节点一个节点组成的!每个节点至少要包含两部分!


2d65d23f6d4748949b924e4057485923.png


因此,我们有着:


6de278e6d6694ce5bb08e7e842b7e74b.png


注意:


1.从上图可以看出:链式结构在逻辑上是连续的,但是在物理上不一定连续!


2.现实中的节点一般都是从堆上申请出来的


3.从堆上申请的空间是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续!


其实,在数据结构中,链表是分种类的!!


单向,双向,带头,不带头,循环,非循环!


上面的几种来进行排列组合,我们可以发现:一共有8种链表组合!!


image.png


其中,在上述的8种组合种,我们在学习的过程中,主要强调的是:


单向不带头非循环:笔试面试都是考这个结构


双向不带头非循环:集合类底层是这样操作的!


下面笔者用画图的方式,来带领大家认识一下上述的8种组合!!


1.单向带头非循环


12c3b7f3f8814309a195c64f051d4445.png


在这里需要注意的是:head永远指向头节点,当把元素11删了,头节点仍然不会发生改变


2.单向不带头非循环


34e8d716411043c08c7ffba9fbba23de.png


对于这个:单向不带头非循环:结构简单,一般不会用来存储数据,实际中更多的是作为其他数据结构的子结构!如:哈希桶,用到的就是链表,等等,面试笔试中用到的也是很多!!


对于这个操作,head虽然指向11处的节点,说明此时11处的节点是这个链表的头部,但是,当我们把11这个节点给删除了以后,此时head就指向12处的节点,因此头节点head也就改变为:12处的节点了!!


3.单向带头循环


92ba0822ed0b46e1ae72df8a17d3a45b.png


因此,我们可以发现:单向的链表,是一直从前往后!!


而接下来我们要进行的是双向的链表:可以从前往后,也可以进行从后往前!


双向的节点:


d79b274929334152a6d38be91e2d1be3.png


因此,我们来认识一下:双向不带头非循环的节点:


dfc80ca9d8004e6c9ddc00e8448ffc6a.png


对于双向的其他组合,笔者就不再进行强调了!毕竟很少使用!我们在后续也不会进行讲解!


经过上面的几个讲解,我们可以看出来:


链表跟顺序表的区别:


链表:物理上(真实的内存)不一定是连续的,逻辑上(指向下一个)是连续的


顺序表:物理上和逻辑上都是连续的!


到此,笔者变将链表的基础知识讲解完了,那么后续的一篇博客,就该讲解链表的实现了!!有想法的各位老铁,可以后续跟踪笔者博客哟!


相关文章
|
存储 算法
【数据结构和算法】图的各类概念与图的存储结构(还有十字链表与邻接多重表的介绍)
【数据结构和算法】图的各类概念与图的存储结构(还有十字链表与邻接多重表的介绍)
289 0
【数据结构和算法】图的各类概念与图的存储结构(还有十字链表与邻接多重表的介绍)
|
存储
线性表的链式存储——链表
线性表的链式存储——链表
246 0
|
存储 API
【数据结构】线性表的链式存储(链表)API及实现
【数据结构】线性表的链式存储(链表)API及实现
173 0
【数据结构】线性表的链式存储(链表)API及实现
|
存储
编写一个应用程序,在主类Test1类中,创建两个链表List<E>对象,分别存储通过键盘输入的字符串内容
编写一个应用程序,在主类Test1类中,创建两个链表List<E>对象,分别存储通过键盘输入的字符串内容
96 0
数据结构——线性表的链式存储结构3(双向循环链表)
数据结构——线性表的链式存储结构3(双向循环链表)
数据结构——线性表的链式存储结构3(双向循环链表)
数据结构——线性表的链式存储结构2(静态链表)
数据结构——线性表的链式存储结构2(静态链表)
数据结构——线性表的链式存储结构2(静态链表)
|
存储
链表存储基本操作
#include #include #include #include /*定义表示结点的结构体类型*/ typedef struct list { int data; struct list* ...
729 0