题目:
代码实现:
#include<iostream>
using namespace std;
#define ElemType int
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_H(LinkList &L)//尾插法创建单链表
{
int a;
LNode *p,*r;
L=new LNode;
L->next=NULL;
r=L;
cin>>a;
while(a!=9999)
{
p=new LNode;
p->data=a;
p->next=NULL;
r->next=p;
r=p;
cin>>a;
}
}
//本题解答.............................
void DeleteSame(LinkList &L)
{
LNode *later,*front,*p;
later=L->next;
p=later;
front=L->next->next;
while(later->next)
{
while(front->data!=later->data&&front->next)
{
front=front->next;
p=p->next;
}
if(front->data==later->data)
{
p->next=front->next;
delete front;
front=p->next;
}
if(front==NULL)
{
later=later->next;
front=later->next;
p=later;
}
if(front->next==NULL)
{
later=later->next;
front=later->next;
p=later;
}
}
}
//.....................................
void ShowList(LinkList &L)//显示自己的操作结果
{
LNode *k=L->next;
printf("打印整个操作后的单链表的情况:\n");
while(k){
printf(" %d ",k->data);
k=k->next;
}
printf("\n");
}
void DestroyList(LinkList &L)//销毁单链表
{
LNode *P=L;
while(L)
{
L=L->next;
printf("\n成功删除%d\n",P->data);
delete P;
P=L;
}
}
int main()
{
LinkList L;
cout<<"\n创建单链表L:"<<endl;
CreateList_H(L);
DeleteSame(L);//删除单链表L中的重复结点(本题解答)
ShowList(L);
DestroyList(L);
}
算法思想:在链表头结点一端放上两个指针later和front,并且front在later刚好前一个的位置,算法执行时,front不断向前移动,直到front找到一个与later指向的结点保存数据重复的结点或者是front到达了链表的尽头,如果发生了前者,就把当前front指向的这个结点给删了,然后front继续前进直到后一种情况发生,当后一种情况发生时,later应向前移动一位,然后front回到later刚好前一个的位置,然后算法又开始像最初那样开始执行,直到later指针也到了链表的尽头。