上篇博客,笔者讲解了一下顺序表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.单向带头循环
因此,我们可以发现:单向的链表,是一直从前往后!!
而接下来我们要进行的是双向的链表:可以从前往后,也可以进行从后往前!
双向的节点:
因此,我们来认识一下:双向不带头非循环的节点:
对于双向的其他组合,笔者就不再进行强调了!毕竟很少使用!我们在后续也不会进行讲解!
经过上面的几个讲解,我们可以看出来:
链表跟顺序表的区别:
链表:物理上(真实的内存)不一定是连续的,逻辑上(指向下一个)是连续的
顺序表:物理上和逻辑上都是连续的!
到此,笔者变将链表的基础知识讲解完了,那么后续的一篇博客,就该讲解链表的实现了!!有想法的各位老铁,可以后续跟踪笔者博客哟!