链表排序相关算法题|删除节点输出有序结果|不带头节点单链表排序|带头节点单链表排序|单链表快排(C)

408数据结构一图流复习:线性表、树、图与排序算法全梳理 数据结构作为计算机专业的核心基础课,其本质是存储结构与操作集合的有机结合,顺序存储与链式存储的灵活运用构成了线性表、栈、队列、树、图等各类结构的实现基石。理解时间复杂度与空间复杂度的取舍,能帮助学习者在面对不同应用场景时选择最优方案,例如二叉树遍历、最小生成树、最短路径以及各类排序算法。在408考研与期末复习中,建立清晰的知识地图至关重要。本文以“一图流”方式系统梳理了从线性表到排序算法的核心脉络、常考题型与易错点,帮助读者快速定位薄弱环节,提升复习效率,为计算机专业基础打下扎实根基。 阅读详情

删除节点输出有序结果

给定一个带表头节点的单链表,设head为头指针,data为整型元素
按递增次序输出单链表中的各节点的数据元素,并释放节点所占的存储空间
不允许使用数组做辅助空间

算法思想

应对链表进行遍历,在每趟遍历中查找出整个链表最小值元素,输出并释放节点所占空间;再查找最小值元素,输出并释放节点,如此下去直到链表为空,最后释放头节点所占的存储空间
![[Pasted image 20241112214041.png]]

遍历一遍后,prev的next为最小值节点
![[Pasted image 20241112214110.png]]

输出prev的next的data值
创建指针del保存prev的next
![[Pasted image 20241112214150.png]]

prev的next指向del的next
![[Pasted image 20241112214221.png]]

释放del节点
![[Pasted image 20241112214234.png]]

完成删除
从头开始再次遍历,最终输出的结果成递增排列

void MiniDelete(LinkList &head)
{
	// 循环到只剩头节点
	while (head->next)
	{
		// prev保存最小值节点的前驱节点的指针,初始假定prev的next是最小的
		LNode* prev = head;
		// cur为工作指针
		LNode* cur = prev->next;
		while (cur->next)
		{
			// 如果cur的next的值小于prev的next的值,将prev指向cur
			if (cur->next->data < prev->next->data)
			{
				prev = cur;
			}
			// cur往后移
			cur = cur->next;
		}
		// 输出元素最小值的数据
		printf("%d\n", prev->next->data);

		// 删除元素值最小的节点,释放节点空间
		LNode* del = prev->next;
		prev->next = del->next;
		free(del);
	}
	// 释放头节点
	free(head);
}

不带头节点单链表排序

已知不带头节点的线性链表head,将该链表按节点数据域大小从小到大重新链接
要求链接过程中不得使用除该链表以外的任何链节点空间

算法思想

本质上是排序问题
链表上排序采用直接插入排序比较方便
首先假定第一个节点有序,然后从第二个节点开始,依次插入到前面有序链表当中,最终达到整个链表有序

创建工作指针cur指向head的next
![[Pasted image 20241112223036.png]]

将第一个节点断开,变为有序链表
![[Pasted image 20241112223052.png]]

cur指针遍历整个待排序链表,直到cur指向NULL
创建指针next保存cur的下一个
![[Pasted image 20241112223138.png]]

创建一个指针指向有序链表中要插入位置的前一个节点
![[Pasted image 20241112223556.png]]

如果cur的值比head的节点的值小
需要将cur的next指向head
![[Pasted image 20241112223628.png]]

将最小的节点变为head节点,即cur节点
![[Pasted image 20241112224014.png]]

cur指向next,继续遍历待排序链表
![[Pasted image 20241112224040.png]]

下一轮循环,next指向cur的next
![[Pasted image 20241112224052.png]]

如果cur的值比head的值大
需要遍历有序链表,查找有序链表中小于cur的值的最后一个节点
用prev指针遍历,直到prev的next指向NULL,或者prev的next的值大于等于cur的值
这样cur直接插入在prev的后面

cur的next指向prev的next
![[Pasted image 20241112224449.png]]

prev的next指向cur
![[Pasted image 20241112224518.png]]

LinkList LinkListSort(LinkList head)
{
	// cur是工作指针,指向待排序的当前元素
	LNode* cur = head->next;
	// 假定第一个元素有序,即链表中现在只有head一个节点
	head->next = NULL;

	while (cur)
	{
		// next是cur的后继
		LNode* next = cur->next;
		// 每次循环将prev重新指向有序链表的第一个节点
		LNode* prev = head;
		// 处理待排序节点cur比第一个元素节点小的情况
		if (prev->data > cur->data)
		{
			// 链表指针指向最小元素
			cur->next = head;
			head = cur;
		}
		else
		{
			// 查找有序链表中小于cur的值的最后一个节点
			while(prev->next && prev->next->data < cur->data)
			{
				prev = prev->next;
			}
			// 将当前排序节点链入有序链表中
			cur->next = prev->next;
			prev->next = cur;
		}
		// cur指向下一个待排序节点
		cur = next;
	}
	return head;
}

带头节点单链表排序

设L为单链表的头节点地址,其数据节点的数据域都是正整数且无相同的
利用直接插入的原则把该链表整理成数据递增的有序单链表的算法

算法思想

单链表带头节点,要求用直接插入排序原则,从第二个节点开始,将各节点依次插入到有序链表中

LinkList LinkListInsertSort(LinkList &L)
{
	// 如果L不为空表
	if (L->next)
	{
		// cur指向第一节点的后继
		LNode* cur = L->next->next;
		// 认为第一元素有序,从第二个元素开始依次插入
		L->next->next = NULL;
	}
	
	while (cur)
	{
		// 暂存cur的后继
		LNode* next = cur->next;
		LNode* prev = L;
		// 查找插入的位置
		while (prev->next && prev->next->data < cur->data)
		{
			prev = prev->next;
		}
		// 将cur节点链入链表
		cur->next = prev->next;
		prev->next = cur;
	}
	cur = next;

	return L;
}

单链表快排

给一个链表的头节点head,将其按升序排列并返回排序后的链表

算法思想

遍历获取链表节点值,利用快排函数,qsort进行排序,再存储

int compare(void* a, void* b)
{
	// 排升序
	return *(int*)a - *(int*)b;
}
LinkList sortList(LinkList &head)
{
	// 若该链表是空表,返回NULL
	if (head == NULL)
		return NULL;

	// 创建一个足够大的数组,全部初始化为0
	int num[50000] = {0};
	int numsize = 0;
	// 创建一个工作指针cur指向head头节点
	LNode* cur = head;
	// 开始遍历,将链表中的数据存储到数组中
	while (cur)
	{
		num[numsize++] = cur->val;
		cur = cur->next;
	}
	// qsort将数组中的数据排序
	qsort(num, numsize, sizeof(int), compare);
	// 初始化cur指针和数组下标
	cur = head;
	numsize = 0;
	// 再遍历链表,将数组中的值依次存储到节点中
	while (cur)
	{
		cur->val = num[numsize++];
		cur = cur->next;
	}
	// 返回头节点
	return head;
}
C语言基础笔试核心考点:指针、内存与字符串实战解析 C语言是系统开发与嵌入式领域的基石,其核心在于对内存与指针的精确控制。理解数组与指针的关系、结构体内存对齐、字符串安全操作,是编写健壮代码的前提。这些基础能力不仅在校招笔试中至关重要,也直接关系到音视频客户端、服务端等高性能场景的工程实践。本文以欢聚时代2017年校招C基础类笔试为切入点,系统梳理了指针运算、字符串处理、结构体内存对齐、位运算与宏定义、链表反转及文件操作等高频考点,并给出典型题目的标准解法和笔试现场的答题策略,帮助读者构建完整的C语言复习路径。 阅读详情

相关推荐

NGSIM数据集字段解析:从车辆轨迹到交通行为分析

本文深度解析NGSIM数据集的核心字段及其在交通行为分析中的应用。详细解读了车辆时空定位、状态属性及交互关系等关键字段,并通过高速路“幽灵堵车”和城市路口左转行为两个实战案例,展示了如何利用该数据集进行微观交通行为建模与驾驶特征提取,为交通流研究和自动驾驶算法测试提供数据基础。

weixin_29172963的博客 147

C-单链表与双链表

单链表(一)结构定义 (一)结构定义

qq_48083892的博客 345

Xilinx UltraScale+ FPGA实战:手把手教你实现USB3.0设备开发(附原理图+代码)

本文详细介绍了如何使用Xilinx UltraScale+ FPGA开发USB3.0设备,涵盖硬件设计、Vivado工程配置、Petalinux系统定制及功能测试全流程。通过实战案例和优化技巧,帮助开发者快速掌握高速数据传输实现方法,提升嵌入式系统开发效率。

weixin_29159995的博客 209

C语言对单链表所有操作与一些相关面试题

/ 声明并定义个单链表结构体int val;//数据 成员变量//结构体调用自己的类型}ListNode;

CHNIM的博客 837

Windows server 2012R2安装Oracle11g

打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Database Configuration Assistant。打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Net Configuration Assistant。首先打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。选择仅安装数据库软件。

qq_74770105的博客 3596

别再混淆了!深入浅出图解四元数姿态控制中的‘误差四元数’(附四种定义对比与仿真)

本文深入解析四元数姿态控制中的误差四元数定义差异,对比四种常见定义(如Q₀∘Q⁻¹与Q⁻¹∘Q₀)及其对PD控制性能的影响。通过刚体动力学仿真验证,揭示定义二(Q⁻¹∘Q₀)在无人机和航天器控制中的最优性能,提供工程实践建议与参数整定技巧,帮助开发者避免常见陷阱并提升控制效率。

weixin_42528191的博客 277

leetcode总结无止境系列之链表

链表是面试中十分容易考到的题目,一般代码比较短,而且考查面试者的思维全面性和写无bug代码的能力。在写链表的题目时,建议画出示意图,并把头结点、尾节点这些特殊的结点考虑在内。 主要的技巧就是要用dummy head,就是在链表头加一个节点指向head,这样可以避免判断头指针,统一处理所有情况,最后返回dummy->next;另外有一个跟dummy head等价的方法是用指针的指针**p去处理

Thinking 3594

波束管理 Beam Management

Beam Management in 5G NR   波束管理,是5G NR中基于信道质量来动态选择每个UE和gNB之间以什么方向和频率的波束beam来进行通信。   背景   5G NR(New Radio)支持非常高的数据速率和更低的延迟。5G NR支持FR1和FR2频段,FR1为亚6 GHz(450至6000 MHz);FR2为毫米波段(24.25 GHz至52.6 GHz)。   由于毫米波频带使用非常高的频率,因此会导致传播损耗和其他损耗。为了补偿损失,在这种频率下定向通信是必不可少的。

最忆是江南的博客 5826

11-数据结构_链表相关操作

// 动态创建非循环单链表, 并返回头指针 PNODE createList(void); // 遍历链表 void traverseList(PNODE pHead); // 是否为空 bool isEmpty(PNODE pHead); // 链表长度 int listSize(PNODE pHead); // 插入一个元素, pos-位置(首结点为索引为1), value-插

吴钦飞 989

MOS管关断时尖峰电压的5种实用抑制方案(附实测数据对比)

本文针对MOS管关断时产生的尖峰电压问题,提供了五种经过实验室实测验证的实用抑制方案。文章从尖峰电压的成因分析入手,详细阐述了优化PCB布局、设计RC缓冲电路、选用TVS二极管钳位、调节驱动电路以及使用磁珠吸收高频振荡等方法的原理、实施步骤与实测数据对比,为硬件工程师解决开关电源和电机驱动中的过压应力与EMI问题提供了系统性的实战指南。

1239

YOLOv8改进:在C2F模块中引入RepGhost Bottleneck模块

C2F类是YOLOv8中的C2F模块的实现,它包含一个RepGhostBottleneck模块、一个卷积层和一个批归一化层。通过在C2F模块中引入RepGhost Bottleneck模块,我们可以在保持计算效率的同时提升模型的表达能力。这是因为RepGhost Bottleneck模块通过引入重复的卷积核来扩展模型的感受野,从而增加了模型对不同尺度目标的感知能力。RepGhost Bottleneck是一种用于卷积神经网络的改进模块,它可以在保持计算效率的同时提升模型的表达能力。希望以上内容对你有帮助!

IlgCrystal的博客 1306

数据结构——链表

这里仅实现了前插法(头插法),尾插法可以按照此方法类比实现,不过需要用一个变量记录。链表因其插入删除操作的灵活性而在数据结构中占有重要的一席之地。下面重点说一下单链表的结构体实现方式。链表最后一个节点的位置。

dou2629531529的博客 340

【部署】Docker部署OpenClaw及常见问题解决(win11)

给AI单独开一个隔离的小容器,AI执行所有命令、下载文件都在这个小盒子里,就算AI被诱导执行危险命令,也不会影响你Win11本机的文件和系统,是必开的安全功能。Docker容器里的OAuth回调,会尝试在你Win11本机的1455端口捕获认证信息,但容器和Win11本机的网络隔离,导致浏览器访问不到这个回调地址。「挂载」就是把你Win11本机的文件夹,共享给容器里的「虚拟小电脑」,两边都能读写文件,比如你想让AI操作你D盘里的代码文件,就需要挂载。

海兰 4697

C语言数据结构实战:从链表到排序算法的代码实现与调试指南

数据结构是计算机科学的核心基础,它研究如何在内存中高效地组织和管理数据。其核心原理在于通过定义特定的数据组织方式(如线性表、树、图)和相应的操作规则(如插入、删除、查找),来优化程序的时空效率。掌握数据结构对于编写高性能、可维护的软件至关重要,广泛应用于数据库索引、编译器设计、网络路由和算法优化等场景。本文聚焦于C语言环境下的数据结构实践,针对初学者从语法过渡到应用的常见痛点,提供了可运行的代码示例和调试方法。内容涵盖链表、栈、队列、二叉树和排序算法等关键结构,特别强调了指针操作、递归理解和边界条件处理等核

weixin_34121282的博客 373

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

东北大学——考研初试——计算机842——线性表编程题

顺序表的定义 typedef struct SqList { int data[Max]; int length; }SqList; 需要掌握的基本操作 插入 先从后往前挪,给插入地方留位置 删除 从前往后挪,覆盖删除的地方 修改 查找 交换 快排模板 void func(int A[], int low, int high) { if(low >= high) { return; } int temp = A[low];

virgilwjj 390

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【CareerCup】 Linked Lists—Q2.1

题目: Write code to remove duplicates from an unsorted linked list. FOLLOW UP How would you solve this problem if a temporary buffer is not allowed? 翻译: 写一个程序从一个未排序的链表中移除重复的项 另外,如果不允许使用临时缓存,你如何解决这个问题?

兰亭风雨的专栏 2563

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

校招数据结构笔试题解析:从链表到哈希表的备考攻略

数据结构是计算机科学的核心基石,无论是链表、栈、队列还是二叉树、哈希表,都构成了算法与系统设计的底层逻辑。理解这些结构的原理与复杂度,是解决实际工程问题的关键能力。在技术面试中,考察候选人对数据结构内功的掌握程度,已成为企业筛选人才的重要标准。从链表反转到二叉树遍历,从快排到哈希冲突处理,每类考点都对应着真实业务中的性能优化场景。本文基于某电商平台校招笔试题,系统梳理高频考点与解题思路,帮助读者建立从基础概念到工程实践的完整认知框架,从而在笔试与面试中游刃有余。

weixin_30402343的博客 321

考研线性表习题讲解

队列是指先进先出的一种方式同时头出元素为进元素,因此为了方便插入元素就需要一个尾指针使得插入元素的时间复杂度为1删除时间复杂度的操作也为一,虽然说需要带尾指针的循环单链表,但是这句话就包含了一个重要条件头指针是一定有的。2n个元素链表的效率要高于顺序表,首先复习一下顺序表可以进行随机访问时间复杂度为1,链表可以进行插入操作时间复杂度为1,这些是他们各自的优点,缺点:顺序表插入一个人元素的平均时间复杂度为n,链表随机访问一个元素的时间复杂度为n。最后一个位置插入和第一个位置删除,,带尾指针的循环单链表。

m0_64845434的博客 642

Java语言面试-数据结构和算法相关面试

一、数组和链表的区别 1、数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。 2、链表恰好相反,链表中的元素在内存中...

yaoming168的专栏 356

数据结构笔试王道50个错误点汇总

n个结点,m路归并, q = (n - 1) % (m - 1),虚段个数是 (m - 1) - q。求nextval数组,看next对应的值,所在的元素,是不是一样的,一样的就是他的nextval。注意,快排平均的空间复杂度是O(log2n),而归并和快排最坏都是O(n),堆排序是O(1)注意一下,链式结构的两个链表,N在M的后面,那么时间复杂度就是O(m),别忘了遍历的时间。图的遍历不是简单的从一个顶点出发访问其他顶点的。边表是右边的表,出现的次数应当是改顶点的入度,出度是顶点表引出的个数。

yuezi的博客 722

就NTMD叫算法?算法脑回路复习篇

就NTMD叫算法? 数组 二分查找 注意l和r的意义 维护l和r的边界 三路快排 LeetCode75:给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色 使用两个指针,l,r分别交换数组中每一个地方的0和2 交换后减少r的值和增加l的值来确定快排 对撞指正 LeetCode167:给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

木寸~ 1022

C语言数据结构实战:课后习题精解与典型问题剖析

本文针对C语言数据结构课后习题进行精解与典型问题剖析,涵盖线性表、栈、队列、树、图等核心数据结构。通过实战代码示例,深入讲解指针操作、递归应用、算法优化等关键技巧,帮助读者将理论知识转化为编程能力,有效提升数据结构实战水平。

weixin_29007135的博客 300

重庆邮电大学802数据结构考研:严蔚敏教材核心考点与高效复习指南

数据结构是计算机科学的核心基础,它研究数据的组织、存储与操作方式,其原理在于通过逻辑与物理结构的有效映射,提升程序运行效率。掌握数据结构的技术价值在于能够设计出性能更优、资源消耗更少的算法与系统。在考研、求职笔试和软件开发等应用场景中,对数据结构与算法的深入理解是衡量工程师能力的关键标尺。本文聚焦于重庆邮电大学计算机考研专业课802数据结构,以严蔚敏版教材为蓝本,提供一份高效的备考路线图。内容涵盖**线性表、树与二叉树、图**等核心章节的重点剖析,以及**算法实现**专项训练,旨在帮助考生精准把握高频考点,

weixin_33805992的博客 513

数据结构初阶 - 汇总

数据结构初阶汇总

fantastic_13_7的博客 588

list类,这不是一看就懂吗!

list这个类就是属于STL的一部分,list在这里是一个类类型的模板,简单来说,list就是我们之前所学过的带头双向循环链表这个数据结构。

2301_81390458的博客 2086

C++-----list

C++list详解,模拟实现,重点为迭代器

KLZUQ的博客 1611
上一篇: 链表与交换相关算法题|数值与后继节点交换|两两交换节点|交换当前节点与后继节点(C)
下一篇: 链表相关其他算法题1|按访问频度排序|求链表的最大孪生和|后半段原地逆置|找链表中间节点(C)
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值