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

动态大致图解如下:

相关推荐
许小燚4 小时前
线性表——双向链表
数据结构·链表
Dann Hiroaki4 小时前
笔记分享: 哈尔滨工业大学CS31002编译原理——02. 语法分析
笔记·算法
KhalilRuan5 小时前
Unity-MMORPG内容笔记-其三
笔记
九年义务漏网鲨鱼5 小时前
【大模型学习 | MINIGPT-4原理】
人工智能·深度学习·学习·语言模型·多模态
jz_ddk5 小时前
[学习] C语言数学库函数背后的故事:`double erf(double x)`
c语言·开发语言·学习
kfepiza6 小时前
Debian的`/etc/network/interfaces`的`allow-hotplug`和`auto`对比讲解 笔记250704
linux·服务器·网络·笔记·debian
qqxhb6 小时前
零基础数据结构与算法——第四章:基础算法-排序(上)
java·数据结构·算法·冒泡·插入·选择
爱莉希雅&&&6 小时前
技术面试题,HR面试题
开发语言·学习·面试
晚云与城6 小时前
【数据结构】顺序表和链表
数据结构·链表
FirstFrost --sy8 小时前
数据结构之二叉树
c语言·数据结构·c++·算法·链表·深度优先·广度优先