单链表的应用--删除无序表中重复的元素

  删除无序表中重复的元素,利用前文写好的链表的框架,在链表类中补充LinkListDelNormalDup方法。

一、问题分析

  单链表中的元素可能是无序的,因此和之前的删除有序表中重复的元素的算法不同。下面是单链表分别删除重复元素之前和之后的情况。
  原链表:
原链表
  删除重复元素之后的链表:
在这里插入图片描述

二、代码分析

  对于单链表中的非空节点p,应该判断此结点之后的其他所有结点,如果存在于结点p的数据域相等的结点,则删除此结点。为了便于删除操作,在比较过程中,记录待比较结点的前一个位置。
  伪代码如下:

1.p=first->next;
2.当p不为空时循环:
	2.1 q=p;
	2.2当q->next不为空时循环;
		2.2.1如果p->data==q->next->data,则删除q->next;
		2.2.2否则后移q;
	2.3 p后移;

1.链表类LinkList

  在链表类中声明Union方法。

/*位于LinkList.h文件中*/
template <class ElemType>
class LinkList{
	public:
		LinkList();//构造函数 
		~LinkList();//析构函数 
		void Insert(int i ,ElemType x);//插入函数 
		void PrintList();//打印所有元素  
		int Length();//获取链表长度
		ElemType Get(int i) ;//按位查找,返回第i个元素的值
		int Locate(ElemType x) ;//按值查找,返回x在单链表中的位置
		ElemType Delete(int i) ;//删除第i个元素 
		void LinkListDelNormalDup() ;
	private:
		Node<ElemType>* first; //头指针 
}; 

2.链表方法LinkListDelNormalDup

/*位于LinkList.cpp文件中*/
template <class ElemType>
void LinkList<ElemType>::LinkListDelNormalDup()
{
	Node<ElemType>* p=this->first->next;
	Node<ElemType>* q=NULL;
	while(p!=NULL)
	{
		q=p;
		while(q->next!=NULL)
		{
			/*出现重复元素,删除*/
			if(p->data==q->next->data)
			{
				Node<ElemType>* r=q->next;
				q->next=r->next;
				delete r; 
			}
			/*没有重复元素,继续后移判断*/
			else
			{
				q=q->next;
			}
		}
		p=p->next;
	}
}

三、测试代码

1.主函数

#include <iostream>
#include "LinkList.h"
#include "LinkList.cpp" 

using namespace std;

int  main() {
	LinkList<int> L;
	/*插入元素*/
	L.Insert(1,3);
	L.Insert(2,2);
	L.Insert(3,3);
	L.Insert(4,7);
	L.Insert(5,7);	
	L.Insert(6,3);	
	L.Insert(7,9);	
	L.Insert(8,7);	
	cout<<"L链表数据:" <<endl;
	L.PrintList();
	cout<<"\nL链表删除重复元素后的数据:" <<endl;
	L.LinkListDelNormalDup();
	L.PrintList();	

	return 1; 
}

2.输出结果

L链表数据:
3 2 3 7 7 3 9 7
L链表删除重复元素后的数据:
3 2 7 9

四、源代码获取(免积分)

删除普通单链表中的重复元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值