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

上篇博客,笔者讲解了一下顺序表ArrayList,对于ArrayList有想法的各位老铁可以看一下:值得思索的:ArrayList和线性表,你确定错过这次机会_念君思宁的博客-CSDN博客值得思索的:ArrayList和线性表,你确定错过这次机会??https://blog.csdn.net/weixin_64308540/article/details/128322151?spm=1001.2014.3001.5502对于这篇博客,算是熬近了笔者的心血,导致最后休息了好几天才缓过来!!既然笔者能写出上篇的文章,那么笔者对于链表,想必也能写出一样优秀的文章,那么就请齿目以待吧!!加油!!

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

那么言归正传吧!!

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

顺序表ArrayList:

优点

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

缺点

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

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

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

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

链式存储:链表!

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

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

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

 因此,我们有着:

注意:

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

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

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

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

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

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

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

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

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

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

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

1.单向带头非循环

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

2.单向不带头非循环

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

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

3.单向带头循环

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

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

双向的节点

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

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

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

链表跟顺序表的区别:

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_64308540/article/details/128374876
今日推荐