一、顺序表和链表的定义
先给大家鼓个劲,顺序表和链表没有传说中那么难.说起顺序表和链表,我们先要说的就是线性表。因为顺序表和链表实际上是特殊的线性表。
1.线性表的定义:
何为线性表?
线性表顾名思义,就是一个线性的表。也就是说在我们用眼睛看起来它就是一条线。它是n个具有相同特性的数据元素的有限序列,线性表是在实际开发中用途很广泛的一种数据结构。它包含:顺序表、链表、栈、队列、字符串等等。(对于栈和队列在上篇博客中有详细讲解)
2.顺序表的定义:
顺序表是线性表的一种,好多书上是这样解释的:它是在逻辑上和物理空间上连续的。本人并不喜欢这两个高端的词语,下边我们来解释这两个词语,帮助大家理解。
解释:理解逻辑上和物理空间上具体含义。
逻辑上:其实不要想象的那么高大上,它这里的意思就是我们人
眼睛能看见的样子就是逻辑上,我们实际将顺序表画出来就是一条直线。
物理空间上:指得就是内存上,就是在存储时候的指针,就是一个地址。(在Java中我们将叫引用,是一个低配指针)。
为了方便大家的理解,下边统一将“物理空间上”叫做内存上
顺序表的样子:(内部就是一个数组)

3.链表的定义:
链表也是线性表的一类,它在逻辑上也是线性的。但是在物理空间上(内存上)不是连续的。一个链表一定有节点,节点里边存的是两个参数(一是节点里具体元素(val),二是指向下一个节点的next引用)。
二、顺序表和链表的实现
1.顺序表的实现:
上边我们讲过顺序表不论是逻辑上还是物理空间上都是连续的,想一下我们学过的数组是不是和这种结构很像呢?因此我们在实现顺序表的时候用数组来实现。
2.链表的实现:
因为链表在内存上是不连续的,所以我们要先通过前一个节点找到后一个节点。所以才创建了节点这个名词,节点里边存两个参数,分别是元素和next 引用(用来找下一个节点)。
节点(结点)的理解:我们这样来理解,把节点想象为一个大的框子,节点里边存了两个参数,一个是节点里边的具体元素,另一个是指向下一个节点的引用(next)。有了这两个参数我们就能用链表来组织并联系所有的元素。
下边给大家一张图,帮助理解:

我们可以清晰的看见,链表(LinkedList)就是一种线性结构,图中每一个长方形的框子就叫做节点(Node)。图中的它里边有两个参数:一个是图中的元素(val)叫做数据域,一个是图中用来找下一个节点的next,叫做指针域。通过next引用就能将所有的元素串联在一块了,一个链表就腾空出世了。
三、顺序表和链表的区别(重点):
经过我们上边的解释,大家应该多少对链表和顺序表有了一定的理解了吧,下边我们来讲顺序表和链表的区别。
1.存储上:
顺序表:顺序表在内存上是连续的
链表:链表在内存上是不连续的。
2.实现方式上:
顺序表:顺序表是通过数组来实现的,
链表:由于链表的内存不连续特性,我们只能借助节点来实现。
3.存储密度上:
顺序表:顺序表它开辟一块内存就实实在在的存了一个元素,要是用多少开辟多少空间的话,顺序表的存储密度就是百分之百。
链表:因为链表中有两个参数,存储元素用了一半,next引用占了一半,所以链表的存储密度只能达到百分之五十。
4.批量创建数据时:
顺序表:顺序表要想提前组织一系列数据,就得提前知道数据的多少。要不然就需要进行扩容,比较麻烦。当然我们也可以用动态数组实现一个动态顺序表。
链表:链表不用关心扩容问题,用多少就自己申请多少。
5.访问数据时:
顺序表:顺序表也就是数组,是按照下标进行访问的,支持的是随机访问,在进行元素访问的时候效率高。
链表:因为其内存不连续的特殊结构,要想访问数据,就得找到它的前一个元素,不能随机访问数据,访问数据时效率低。
6.重点哦,进行基本操作(增删改查)时:
a)查找元素时:
- 顺序表:基于它的随机访问数据特性,查找元素时时间复杂度O(1)。
- 链表:不能随机访问数据,查找元素时的时间复杂度是O(N)。
b)删除和增加元素的时候:
-
顺序表:由于它原来的顺序结构不能变化,所以不管是删除还是插入元素,都要进行元素的搬运,时间复杂度是O(N)。
-
链表:因为有next引用,要想插入或者删除元素只需要改变引用之间的指向即可,时间复杂度是O(1).注意:
链表虽然插入或者删除的时候时间复杂度是O(1),这里指的是我们在已知要插入位置的时候。倘若我们不知道要插入的位置,还是要先进行遍历,这里也是有一个O(N)的时间复杂度。
四、链表和顺序表的优缺点
1.顺序表的优缺点:
优点:
a)空间连读支持随机访问:
- 上边讲过顺序表支持随机访问数据,空间是连续的,所以说顺序表比较适合干查找工作,其时间复杂度是O(1)。
b)存储密度高:
- 顺序表对对内存的利用率比较高,在已知存储数据的个数后,直接开辟一块刚好够数据的空间,这样的话内存的利用率能达到百分之百。
缺点:
a)插入删除时间复杂度高:
- 顺序表在进行插入和删除的时候,因为空间的连续性,原顺序表的内容不能被改变,所以必定要进行元素的搬运,时间复杂度很高,为0(N)。
b)进行存储数据时局限性较大,要提前申请内存空间:
- 顺序表在进行数据存储的时候要知道数据的大致数量,因为顺序表的实质就是用数组来存储数据的,数组在被创建的时候就要指定大小。在不知道数量的情况下,要是存储的元素过多就要进行扩容,要是创建的数组的过大又会造成空间的浪费。
1.链表的优缺点:
优点:
a) 没有空间的限制,不用考虑扩容,灵活性高:
- 链表在进行数据存储的时候不用考虑申请内存空间,存多少数据就会自己申请多少空间。
b) 插入和删除元素的效率高(在已知要查入位置的时候):
- 因为链表在存储数据的时候,是用next引用来指向的。所以在已知要插入和删除元素位置的时候,直接通过改变引用直接的指向即可。时间复杂度是0(1)。
c)能很好的利用内存中的零散的空间:
- 它不像顺序表在存储时要开辟一大块内存空间,链表在存储时内存不连续,所以只要进行引用指向即可,这样能更好的利用内存中的零散的空间。
缺点:
a)存储密度太小:
- 在进行存储数据时,链表中不仅有数据域还有指针域,指针域里边存的是地址,也就是说一个框子我们真正用于存元素的空间只有一半,剩下的一半要用来存地址。这样看的话存储密度只能达到百分之五十。
b)查找元素很困难,时间复杂度高:
- 上边我们讲过,链表在内存上是不连续的,所以要想查找一个元素,就得知道上一个节点,这样的话,要是要查找一个元素就要进行遍历,时间复杂度是O(N)。
好了上边就是我学完链表和顺序表后,自己的一些总结和认识,要是有遗漏或者错误的地方,还望大家指出并海涵。期待大家的关注,在今后的学习道路上我们一起努力,慢慢变强。
本文深入浅出地介绍了线性表的基础概念,包括顺序表和链表的定义、实现方式及它们之间的区别,并对比了两者的优缺点。

2140

被折叠的 条评论
为什么被折叠?



