学习笔记-数据结构-线性表(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; // 移动到下一个节点
			}
		}
	}
}

动态大致图解如下:

相关推荐
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
_落纸2 天前
三大基础无源电子元件——电阻(R)、电感(L)、电容(C)
笔记
Alice-YUE2 天前
【CSS学习笔记3】css特性
前端·css·笔记·html
2303_Alpha2 天前
SpringBoot
笔记·学习
萘柰奈2 天前
Unity学习----【进阶】TextMeshPro学习(三)--进阶知识点(TMP基础设置,材质球相关,两个辅助工具类)
学习·unity
沐矢羽2 天前
Tomcat PUT方法任意写文件漏洞学习
学习·tomcat
好奇龙猫2 天前
日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(10):91-100语法+考え方13
学习
今后1232 天前
【数据结构】二叉树的概念
数据结构·二叉树
向阳花开_miemie2 天前
Android音频学习(十八)——混音流程
学习·音视频
工大一只猿2 天前
51单片机学习
嵌入式硬件·学习·51单片机