庖丁解牛,详细分析顺序表和链表的定义、实现方式、区别、优缺点。

本文深入浅出地介绍了线性表的基础概念,包括顺序表和链表的定义、实现方式及它们之间的区别,并对比了两者的优缺点。

一、顺序表和链表的定义

先给大家鼓个劲,顺序表和链表没有传说中那么难.说起顺序表和链表,我们先要说的就是线性表。因为顺序表和链表实际上是特殊的线性表

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)。

好了上边就是我学完链表和顺序表后,自己的一些总结和认识,要是有遗漏或者错误的地方,还望大家指出并海涵。期待大家的关注,在今后的学习道路上我们一起努力,慢慢变强。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值