练习题-删除有序单链表中的重复元素(C语言实现)
一、题目
如题所述,是对单链表进行操作,而且链表是有序的,意味着重复元素都是挨在一块儿的,如下图所示:

或者是这样的:

二、思路
既然重复元素都是连续挨着的,那么我们可以设置一个快慢指针,用temp指向上一个元素的值,p指向当前元素,如果p所指和temp所指元素相等,那么把p所指的结点删除,temp保持不动,p指针后移;如果p所指和temp所指元素不等,那么temp向后移动,即temp等于p,然后再把p后移,直到p指向单链表的末尾。如下图:

三、代码实现
bool Del_duplicate(LinkList *B)
{
LinkList *q,*temp;
q = B->next;
temp = q;//temp是慢指针,指向q的前驱
q = q->next;//q往后移动
while(q->next!=NULL)
{
if(q->data == temp->data)//如果p当前指向的元素和前面的结点元素相同则删除p所指结点
temp->next = q->next;//执行删除操作
else
temp = q;//如果不等则更新temp,并且p继续向后移动,直到链表末尾
q = q->next;//q向后移动
}
return true;
}
这种方法实现显然比较简单,当然也还有别的方法,但是我这种方法空间复杂度为O(1),时间复杂度也只是为O(n),也还算不错了。
四、全部代码
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h> //根据C99标准,C语言使用bool类型需要添加这个头文件
typedef int ElemType;
typedef struct LinkNode
{
ElemType data;
struct LinkNode *next

本文介绍了如何使用C语言实现删除有序单链表中重复元素的方法,采用快慢指针技巧,空间复杂度为O(1),时间复杂度为O(n)。代码包括链表初始化、插入元素、输出所有元素和删除重复元素的函数,并提供了测试案例展示操作前后链表状态。
最低0.47元/天 解锁文章
629

被折叠的 条评论
为什么被折叠?



