数据结构系列—线性表(二)

链式存储结构:

由于顺序存储最大的缺点就是增删慢,在增删操作后需要移动大量元素,比较耗费时间。所以链式存储解决了这个问题。

1、定义:

物理存储单元上非连续的、非顺序的存储结构。链式结构中,除了存储数据元素外,还需要存储后继的存储地址。

存储数据元素信息的域叫作"数据域",存储后继位置的域叫作"指针域"(指针域中存储的信息叫作"指针"或"链")

数据域 + 指针域 = 结点(Node)。n个结点链接成为一个链表,即为线性表的链式存储结构。(典型的 LinkList)
在这里插入图片描述

2、链表涉及名词:

链表是由多个"结点"组成,“结点"由数据域指针域组成,若每个结点只包含一个指针域,称之为"单链表

链表中的第一个结点存储位置叫作"头指针" 由于线性表的最后一个元素是没有直接后继的,所以在链式存储中,将最后一个结点指针设置为 null 或 ^ 表示。

单链表的第一个结点前附设一个结点,称为"头结点"。(可存储线性表长度等附加信息,方便对链表的操作。一般为手动设置)

3、头指针和头结点异同:

头指针

  • 1:头指针具有标识作用,常用头指针冠以链表名称。

  • 2:无论链表是否为空,头指针均不为空。是链表的必要元素。

  • 3:指向链表中第一个结点的指针,若链表有头结点,那么就是指向头结点的指针。

头结点

  • 1:为方便操作统一设立的,放在第一个结点前,数据域一般无意义。

  • 2:头结点不是链表必要元素。

  • 3:有了头结点,就统一了对链表中任意结点的插入和删除操作。

4、链式存储结构描述:

若线性表为空表,头结点的指针域就为"空"。头指针是链表的必要元素。
比如:结点1(数据+指针5)————>结点5(数据+指针8)————>结点8(数据+指针…)
在这里插入图片描述

5、单链表查询:

在线性表的顺序存储结构中查找一个元素的存储位置很容易,但在单链表中必须从头开始找。
因为单链表结构中没有定义表长,不能使用for循环来控制,主要核心思想就是"工作指针后移"。

6、单链表插入与删除:

链表名词中说过:结点是由存放数据元素的"数据域"和存放后继"结点地址的指针域"组成。

插入:目前有三个结点p、q、s,如何将s插入?目前p->next=q。
如何将元素s插入?
只需要将结点中的指针进行改变即可,p的指针指向s,s的指针指向q。如下:
s->next = p->next,p->next = s; 也就是说,先将新插入"结点s"的指针域指向"结点q",再将"结点p"的指针指向"结点s"即可。

可不可以 p->next = s,s->next = p->next;?
先将"结点p"的指针指向"结点s",就等同于将"结点p"的指针给覆盖成"结点s"的地址了,相当于p->next=s,也就是指向"结点s"。
在这里插入图片描述
这时候s->next = p->next; 由于p->next = s,那么s->next = s,结果就是我的"结点q"没上级了!!!!!中途掉链子的情况是不能允许的,所以这种插入是失败的。

删除:同样目前有三个结点p、q、s,如何将"结点s"删除?
在这里插入图片描述
只需要将"结点p"的指针指向"结点q"即可,
s = p->next,p->next = s->next;当前"结点s"被"结点p"的指针p->next所指向,将"结点p"的指针指向"结点q"即可。p->next = s->next等同于p->next = p->next->next。

结论:插入和删除的第一步都会进行一个表的遍历步骤,查到结点位置后进行操作。所以这个"遍历步骤"相较于"顺序存储结构"来说,时间复杂度为O(n),当遍历完成后,进入插入和删除操作时,这时候仅仅是移动指针而已,所以复杂度为O(1)。对弈插入和删除频繁的操作来说,单链表的效率优势就更加明显。

7、单链表的创建:

创建单链表的过程就是一个动态生成链表的过程,有以下两种形式进行创建:

1、头插法:始终让新结点在第一的位置。
比如:插入a、b、c三个结点,头结点——>结点c——>结点b——>结点a

2、尾插法:始终让新节点在中断结点的厚点。
比如:插入a、b、c三个结点,头结点——>结点a——>结点b——>结点c

8、单链表的删除:

单链表的删除就是把链表销毁,在内存中释放掉。

具体思路就是循环链表后,每释放一个结点,就把"当前释放结点"前继的指针指向"当前释放结点"指针的指向结点。
在这里插入图片描述
如图所示:将"结点s"删除,就是将前继"结点p"的指针指向"结点q",和上面说的删除操作性质一致。

9、扩展其他链表结构:

静态链表:用数组描述的链表,就是数组元素包含两个数据域,data和cur。和链表相似就是存放数据和游标。

循环链表:将单链表中的终端节点的指针由空指针改为指向头结点,使单链表形成一个闭环。

双向链表:单链表的每个结点中,再设置一个指向前驱结点的指针域。
在这里插入图片描述

10、单链表结构和顺序存储结构优缺点:

a、存储分配
顺序存储结构——>开辟了一段连续的存储单元。
链式存储结构——>用一组任意的存储单元存放线性元素,可连续,也可以不连续。

b、时间性能
顺序存储结构——>查询O(1),插入和删除O(n)。
链式存储结构——>查询O(n),插入和删除O(1)。

c、空间性能
顺序存储结构——>预分配存储空间,分大了,浪费。分小了易发生上溢。
链式存储结构——>不需要分配存储空间,只要有就可以分配。元素个数不受限制。

在增删操作比较多的时候,使用单链表效率会更高,在查询操作比较多的时候,顺序存储结构效率比较高。
无法确定元素个数,使用单链表结构,反之则顺序存储结构。总之只有最适合的,没有最完美的。

总结:

  • 今天主要讲了链式存储的插入、删除,其他链表结构。单链表结构和顺序存储结构优缺点等等。
    在这里插入图片描述
  • 相信大家已经基本了解了链式存储的相关概念。接下来,会针对顺序存储、链式存储进行实战。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值