删除无序表中重复的元素,利用前文写好的链表的框架,在链表类中补充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