问题 B: DS单链表—删除重复元素
时间限制: 1 Sec 内存限制: 128 MB
题目描述
给定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>
#include<algorithm>
#include<cmath>
#include<string>
#include<map>
using namespace std;
map<int, int> mp;
class List
{
public:
int number;
List* next;
List()
{
next = NULL;
}
};
class NList {
List *head;
int len;
public:
NList()
{
len = 0;
head = new List();
}
~NList()
{
List* p, * q;
p = head;
while (p->next)
{
q = p->next;
delete p;
p = q;
}
delete p;
}
void insert(int item)
{
List* pre=NULL, * cur=NULL,*now=NULL;
cur = head;
now = new List();
now->number = item;
now->next = NULL;
while (cur->next!=NULL)
{
pre = cur;
cur = cur->next;
}
cur->next = now;
len++;
}
void display()
{
List* cur;
cur = head->next;
cout << len << ":";
while (cur)
{
cout <<" "<<cur->number ;
cur = cur->next;
}
cout << endl;
}
void del()
{
List* cur = head->next;
List* pre=NULL;
int flag = 1;
while (cur)
{
int temp;
temp = cur->number;
mp[temp]++;
if (mp[temp] >= 2)
{
if (cur->next != NULL)
{
//cur = cur->next;
pre->next = cur->next;
flag = 0;
}
else
{
pre->next = NULL;
}
len--;
}
else
{
flag = 1;
}
if (!flag)
{
cur = cur->next;
}
else
{
pre = cur;
cur = cur->next;
}
}
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
NList p;
int n, number;
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> number;
p.insert(number);
}
//p.display();
p.del();
p.display();
mp.clear();
}
return 0;
}