学习笔记-数据结构-线性表(2024-04-17)

设计一个算法实现在单链表中删除值相同的多余节点的算法。

设计思想 :双指针
变量说明
head - 参数变量,代表链表的头节点。在调用DelSameNum函数时,需要传递链表的头节点的地址给这个参数,从而允许函数对链表进行操作。
p - 指针变量,用于在链表中顺序遍历节点。在外层循环中,p从头节点开始,依次指向链表中的每一个节点,直到最后一个节点。
q - 指针变量,与p配合使用。在内层循环中,q从p所指向节点的下一个节点开始,遍历p之后的所有节点。它用于寻找和删除与p指向节点的data值相同的节点。
s - 指针变量,始终指向q节点的前一个节点。在删除q所指向的节点时,s的next将被更新为q->next,从而维持链表的连续性。s是在内层循环中声明并使用的。

c 复制代码
typedef struct node
{
	int data;
	struct node * next;
}LinkList;
void DelSameNum(LinkList * head)
{
	struct node *p;
	struct node *q;
	for(p=head;p->next!=NULL;p=p->next) // 遍历链表直到最后一个节点
	{
		s=p; // 设置s指向为p,因为删除操作将从p的下一个节点开始
		for(q=p->next;q!=NULL;)
		{
			if(q->data==p->data) // 如果找到值相同的节点
			{
				s->next=q->next; // s下一个所指向的节点直接跳到q的下一个
				free(q); // 释放被删除节点的内存
				q=s->next; // 更新q,继续检查下一个节点
			}
			else
			{
				s=q; // 如果节点值不同,更新s为当前的q
				q=q->next; // 移动到下一个节点
			}
		}
	}
}

动态大致图解如下:

相关推荐
测试_AI_一辰1 小时前
AI测试工程笔记 05:AI评测实践(从数据集到自动评测闭环)
人工智能·笔记·功能测试·自动化·ai编程
We་ct2 小时前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
愣头不青2 小时前
238.除了自身以外数组的乘积
数据结构·算法
Edward111111113 小时前
3月20包装类
学习
电子云与长程纠缠3 小时前
Godot学习03 - 实例化、层级访问、Export
android·学习·godot
青桔柠薯片3 小时前
51单片机(STC89C52RC)学习总结:从裸机编程到外设驱动
嵌入式硬件·学习·51单片机
ambition202423 小时前
最大子数组和算法全解析:从暴力枚举到动态规划优化
数据结构·c++·算法
Book思议-4 小时前
【数据结构实战】线性表的应用
c语言·数据结构·算法·链表
今儿敲了吗4 小时前
python基础学习笔记第六章——函数进阶
笔记·python·学习
richu4 小时前
结合数学思维来深入内存理解哈希散列的实现原理和处理冲突的逻辑
数据结构·哈希冲突