题目描述
给定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; }