给定排好序的链表,删除重复元素,只保留重复元素第一次出现的节点。
问题:
给定:2 3 3 5 7 8 8 8 9 9 10
返回:2 3 5 7 8 9 10
解法:若p->next的值和p的值相等,则将p->next->next赋值给p,删除p->next;重复上述过程直至链表尾端。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int val;
node *next;
node(int v):val(v),next(NULL){}
};
void print(node *hea)
{
node *p=hea;
int f=0;
while(p)
{
if(f)
printf(" ");
printf("%d",p->val);
f=1;
p=p->next;
}
printf("\n");
}
void qc(node *hea)
{
node *p,*qi=hea;
while(qi)
{
p=qi->next;
if(p&&p->val==qi->val)
{
qi->next=p->next;
delete p;
}
else
qi=p;
}
print(hea);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int num;
node *tail,*tmp,*hea;
tail=new node(0);
for(int i=0;i<n;i++)
{
scanf("%d",&num);
tmp=new node(num);
if(i==0)
hea=tmp;
tail->next=tmp;
tail=tmp;
}
qc(hea);
}
return 0;
}