天天看點

排序連結清單去重

給定排好序的連結清單,删除重複元素,隻保留重複元素第一次出現的節點。

問題:

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

繼續閱讀