设计一个算法实现在单链表中删除值相同的多余节点的算法。
设计思想:双指针
变量说明:
head
- 参数变量,代表链表的头节点。在调用DelSameNum函数时,需要传递链表的头节点的地址给这个参数,从而允许函数对链表进行操作。
p
- 指针变量,用于在链表中顺序遍历节点。在外层循环中,p从头节点开始,依次指向链表中的每一个节点,直到最后一个节点。
q
- 指针变量,与p配合使用。在内层循环中,q从p所指向节点的下一个节点开始,遍历p之后的所有节点。它用于寻找和删除与p指向节点的data值相同的节点。
s
- 指针变量,始终指向q节点的前一个节点。在删除q所指向的节点时,s的next将被更新为q->next,从而维持链表的连续性。s是在内层循环中声明并使用的。
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(![请添加图片描述](https://img-blog.csdnimg.cn/direct/074e11af40854da88c6ae01283bf292d.gif)
;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; // 移动到下一个节点
}
}
}
}
动态大致图解如下: