【单链表,循环链表和双向链表的时间效率比较,顺序表和链表的比较,有序表的合并------用顺序表实现,用链表实现】

news/2025/2/23 5:56:26

文章目录

  • 一、单链表,循环链表和双向链表的时间效率比较
  • 二、顺序表和链表的比较
  • 三、线性表的应用
    • 1.线性表的合并
    • 1.1有序表的合并------用顺序表实现
    • 1.2有序表的合并--------用链表实现

一、单链表,循环链表和双向链表的时间效率比较

查找表头结点(首元结点)查找表尾结点查找结点*p的前驱结点
带头结点的单链表LL->next时间复杂度O(1)从L->next依次向后遍历时间复杂度为O(n)通过*p无法找到其前驱
带头结点仅设头指针为L的循环单链表L->next时间复杂度为0(1)从L->next依次向后遍历时间复杂度为O(n)通过p->next可以找到其前驱时间复杂度为O(n)
带头结点仅设尾指针R的循环链表R->next时间复杂度为O(1)R时间复杂度O(1)通过p->next可以找到其前驱的时间复杂度O(n)
带头结点的双向循环链表LL->next时间复杂度为O(1)L->prior时间复杂度为O(1)p->prior时间复杂度为O(1)

二、顺序表和链表的比较

  • 链式存储结构的优点:
    结点空间可以动态申请和释放;
    数据元素的逻辑次序靠结点的指针来指示,插入和删除不需要移动数据元素。
  • 链式存储结构的缺点:
    存储密度小,每个结点的指针域额外需要占用存储空间。(存储密度是指结点数据本身所占的存储量和整个结点结构中所占的存储量之比),即:(结点本身占用的空间)/(节点占用的空间总量))
    在这里插入图片描述
    一般的,存储密度越大,存储空间的使用率就越高。显然,顺序表的存储密度为1(100%),而链表的存储密度小于1.
  • 链式存储结构非随机存储。
    在这里插入图片描述

三、线性表的应用

1.线性表的合并

假设利用两个线性表La和Lb分别表示两个集合A和B,现要求一个新的集合A = A∪B。
在这里插入图片描述
【算法步骤】
依次取出Lb中的每一个元素,执行以下操作:
1.在La中查找该元素。
2.如果找不到,则将其插到La的最后。

1.1有序表的合并------用顺序表实现

已知线性表La和Lb中的数据元素按值递增有序排列,现要求将La和Lb归并为一个新的线性表Lc,且Lc也按递增排列。
在这里插入图片描述

//线性表的合并
void Union(Sqlist La, Sqlist Lb) {
	int La_len = La.length;
	int Lb_len = Lb.length;
	for (int i = 1; i <= La.length; i++) {
		Elemtype e;
		GetElem(Lb, i, e);//查找Lb中的第i个元素,若果存在就赋值给e
		if (!LocateElem(La, e, i)) {//La中不存在与e相同的元素
			//将e插在La的最后
			int m = 0;
			ListInsert(La, ++m, e);
		}
	}
}

1.2有序表的合并--------用链表实现

在这里插入图片描述
①将La的头结点作为Lc的头结点(Lc表示最后合并好的链表)。
②指定三个三个结点
在这里插入图片描述
③比较La和Lb的结点的指针指向的数据域的大小:pa->data < pb->data;那个小的pa连接到Lc上:pc->next = pa就将小的那个链表放进Lc中。
④将pa复制给pc:pc=pa;pa指向下一个结点。
⑤再比较pa和pb的大小,这里的pb比较小,所以在pc后面接上pb:pc->next= pb;
在这里插入图片描述
⑥再将pb赋值给pc;pb往后面移pc=pb->next;
⑦继续比较pa->data和pb->data的值
⑧直到将某一个链表的结点都加入了,就完成链表的合并。
在这里插入图片描述
⑨如果哪个链表非空,就指向哪个链表:pc->next = pa ? pa:pb;

void MergeList(LinkList& La, LinkList& Lb, LinkList& Lc) {
	LinkList pa = La->next;
	LinkList pb = Lb->next;
	LinkList pc = Lc = La;
	while (pa && pb) {
		if (pa->data <= pb->data) {
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else {
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;//如果pa非空那么pc->next = pa,否则pb
	delete Lb;//释放Lb的头结点
}

http://www.niftyadmin.cn/n/5122074.html

相关文章

关于报错java.util.ConcurrentModificationException: null的源码分析和解决

一般有这种问题,方法中至少会有List或者Map下的至少两个子类,有可能参数类型相同,也有可能不同都有可能触发这个问题!其主要原因是使用了ArrayList进行删除操作或者使用iterator遍历集合的同时对集合进行修改都有可能会出现这个问题 ArrayList属于List下的子类 需要区分的是Li…

Java学习 2.Java-数据类型与运算符

初识java回顾&#xff1a; java文件编译 一个java文件有类 类中有方法 java----->类----->方法 idea创建项目 改idea背景色 1. 2. 3. 数据类型与变量 1.字面常量 常量即程序运行期间&#xff0c;固定不变的量称为常量&#xff0c;字面值常量也是常量 字面常量…

从洋河“一带一路”之行,思考白酒国际化的破题道路

在古老的丝绸之路上&#xff0c;岁月不仅留下了无数行商足迹和边塞诗词&#xff0c;也写下了中国白酒出海最初的篇章。 作为一种文化交流的媒介&#xff0c;白酒曾随着陆上和海上丝绸之路来到世界各地&#xff0c;一度成为“世界潮品”。 千年后的今天&#xff0c;为了寻找新…

Linux---(四)权限

文章目录 一、shell命令及运行原理1.什么是操作系统&#xff1f;2.外壳程序3.用户为什么不直接访问操作系统内核?4.操作系统内核为什么不直接把结果显示出来&#xff1f;非要加外壳程序&#xff1f;5.shell理解重点总结&#xff08;1&#xff09;shell是什么&#xff1f;&…

[ThinkPHP]The namespace “work“ is ambiguous (worker, workflow)

问题截图&#xff1a; 解决办法&#xff1a; console.php增加相关配置

GB/T28181协议介绍

GB/T28181协议介绍 文章目录 GB/T28181协议介绍总体介绍GB/T28181基本结构GB/T28181关键协议流程设备注册设备目录查询实时视频播放流程 GB/T28181协议总结 说到GB/T28181协议&#xff0c;如果你是从事视频监控领域的工作&#xff0c;那对他一定不陌生&#xff0c;在公共安全、…

GB/T 26518-2011 高分子增强复合防水片材检测

高分子增强复合片材是指以聚乙烯、乙烯-乙酸乙烯共聚物等高分子材料为主体材料&#xff0c;复合织物等为保护或增强层制成的&#xff0c;用于屋面、室内、墙体、水工水利设施、地下工程等构筑物的防水、防潮以及各类绿化种植屋面的防水片材。 GB/T 26518-2011 高分子增强复合防…

【算法训练-动态规划 五】【二维DP问题】最大正方形

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【动态规划】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…