給定排好序的連結清單,删除重複元素,隻保留重複元素第一次出現的節點。
問題:
給定: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;
}