单链表练习题-删除有序单链表中的重复元素(C语言实现)

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

练习题-删除有序单链表中的重复元素(C语言实现)

一、题目

​ 如题所述,是对单链表进行操作,而且链表是有序的,意味着重复元素都是挨在一块儿的,如下图所示:

image-20211006172050861

​ 或者是这样的:

image-20211006172340409

二、思路

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

image-20211006174032607

三、代码实现

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值