特殊链表及顺序表的合并
循环链表
与单链表不同的地方:最后一个结点的指针域指向L
某些情况下,若在循环链表中设立尾指针而不设头指针(见图2.18(a)),可使一些操作简化。例如,将两个线性表合并成一个表时,仅需将第一个表的尾指针指向第二个表的第38 第2章线性表一个结点,第二个表的尾指针指向第一个表的头结点,然后释放第二个表的头结点。
双向链表
双向链表有直接前驱和直接后继,很多地方与单链表相同,但是插入和删除有很大不同,需同时修改前驱和后继的指针.
顺序表和链表的比较
空间性能的比较
顺序表需要为其分配空间,单链表无需提前分配空间,在扩充时提高效率.
$储存密度=数据元素本身占用的存储量 /结点结构占用的存储量 $
储存密度越大储存空间的利用率越高.如果每个元素数据域占据的空间较小,则指针的结构性开销就占用了整个结点的大部分空间,这样存储密度较小。例如,若单链表的结点数据均为整数,指针所占用的空间和整型量相同,则单链表的存储密度为0.5。因此,如果不考虑顺序表中的空闲区,则顺序表的存储空间利用率为100%, 而单链表的存储空间利用率仅为50% .
时间性能的比较
(l)存取元素的效率
顺序表是由数组实现的,它是一种随机存取结构,指定任意一个位置序号i'都可以在0(1)时间内直接存取该位置上的元素,即取值操作的效率高;而链表是一种顺序存取结构,按位置访问链表中第!个元素时,只能从表头开始依次向后遍历链表,直到找到第i个位置上的元素,时间复杂度为O(n), 即取值操作的效率低。基于此,若线性表的主要操作是和元素位置紧密相关的这类取值操作,很少做插入或删除时,宜采用顺序表作为存储结构。
(2)插入和删除操作的效率
对千链表,在确定插入或删除的位置后,插入或删除操作无需移动数据,只需要修改指针,时间复杂度为0(1)。而对千顺序表,进行插入或删除时,平均要移动表中近一半的结点,时间复杂度为O(n)。尤其是当每个结点的信息量较大时,移动结点的时间开销就相当可观。基千此,对千频繁进行插入或删除操作的线性表,宜采用链表作为存储结构。
线性表的合并
1.先分别获取LA表长m和LB表长n。
2.从LB中第1个数据元素开始,循环n次执行以下操作:
- 从LB中查找第i(1 ::Si::Sn)个数据元素赋给e;
- 在LA中查找元素e,如果不存在,则将e插在表LA的最后。
顺序有序表的合并
1.创建一个表长为m+n的空表LC。
2.指针pc初始化,指向LC的第一个元素。
3.指针pa和pb初始化,分别指向LA和LB的第一个元素。
4.当指针pa和pb均未到达相应表尾时,则依次比较pa和pb所指向的元素值,从LA或LB中"摘取“元素值较小的结点插入到LC的最后。
5.如果pb巳到达LB的表尾, 依次将LA的剩余元素插入LC的最后。
6.如果pa已到达LA的表尾, 依次将LB的剩余元素插入LC的最后。
链表有序表的合并
1.指针pa和pb初始化,分别指向LA和LB的第一个结点。
2.LC的结点取值为LA的头结点。
3.指针pc初始化,指向LC的头结点。
4.当指针pa 和 pb 均未到达相应表尾时,则依次比较pa和 pb 所指向的元素值,从 LA 或LB中"摘取“元素值较小的结点插入到LC的最后。
5.将非空表的剩余段插入到pc所指结点之后。
6.释放LB的头结点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】