天天看点

排序链表去重

给定排好序的链表,删除重复元素,只保留重复元素第一次出现的节点。

问题:

给定: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;
}
           

继续阅读