DS单链表—删除重复元素

题目描述

给定n个整数,按输入顺序建立单链表,删除其中的重复数字,输出结果链表。(要求不可以构建新结点,不可以定义新链表。在原链表上删除。)

输入

测试次数t

每组测试数据一行:

n(表示有n个整数),后跟n个数字

输出

 对每组测试数据,输出删除重复数字后的结果链表表长和每个元素,具体格式见样例。

样例输入

3 10 1 2 3 4 1 2 10 20 30 20 5 1 1 1 1 1 6 20 22 22 22 22 20

样例输出

7: 1 2 3 4 10 20 30 1: 1 2: 20 22

提示

#include<iostream>
using namespace std;
#define ok 0
#define error -1
class CNode
{
    int data;
    CNode *next;
public:
    CNode()
    {
        next=NULL;
    }
    CNode(int n,CNode *p)
    {
        data=n;
        next=p;
    }
    int getdata()
    {
        return data;
    }
    CNode *getnext()
    {
        return next;
    }
    void setnext(CNode *p)
    {
        next=p;
    }
};
 
 
class CList
{
    friend class CNode;
    CNode *head;
    int nodenumber;
public:
    CList()
    {
        head=NULL;
        nodenumber=0;
    }
    void nodeplus()
    {
        nodenumber++;
    }
    void nodeminus()
    {
        nodenumber--;
    }
    void createTailList(int *num,int n)
    {
        CNode *tail;
        CNode *s;
        head=new CNode();
        tail=head;
        for(int i=0;i<n;i++)
        {
            s=new CNode(num[i],NULL);
            tail->setnext(s);
            tail=s;
            nodeplus();
        }
    }
    void refind()
    {
        for(int i=1;i<=nodenumber;i++)
        {
            int need=indexfind(i)->getdata();
            for(int j=i+1;j<=nodenumber;j++)
            {
                CNode *p=indexfind(j);
                if(p->getdata()==need)
                {
                    Delete(j);
                    i--;///回溯
                    break;
                }
            }
        }
    }
    CNode *indexfind(int i)
    {
        if(i<0)
        {
            return NULL;
        }
        CNode *p=head;
        int k=1;
        while(k<=i&&p!=NULL)
        {
            p=p->getnext();
            k++;
        }
        return p;
    }
 
    int Delete(int i)
    {
        if(i<1||i>nodenumber)
        {
            cout<<"error"<<endl;
            return error;
        }
        nodeminus();
        CNode *p=indexfind(i-1);
        CNode *temp=p->getnext();
        p->setnext(temp->getnext());
        delete temp;
        return ok;
    }
    void display()
    {
        cout<<nodenumber<<":";
        CNode *p=head->getnext();
        while(p!=NULL)
        {
            cout<<" "<<p->getdata();
            p=p->getnext();
        }
        cout<<endl;
    }
};
 
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        int *num=new int[n];
        for(int i=0;i<n;i++)
        {
            cin>>num[i];
        }
        CList L;
        L.createTailList(num,n);
        L.refind();
        L.display();
        delete []num;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/SZU-DS-wys/p/12177911.html
今日推荐