题目描述
给定n个整数,按输入顺序建立单链表,删除其中的重复数字,输出结果链表。(要求不可以构建新结点,不可以定义新链表。在原链表上删除。)
输入
测试次数t
每组测试数据一行:
n(表示有n个整数),后跟n个数字
输出
对每组测试数据,输出删除重复数字后的结果链表表彰和每个元素,具体格式见样例。
输入样例1
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
输出样例1
7: 1 2 3 4 10 20 30\n
1: 1\n
2: 20 22
#include<iostream>
using namespace std;
class ListNode {
public://公有,否则Link List无法调用。new ListNode()会报错
int data;
ListNode* next;
ListNode() {
next = NULL;
}
};
class LinkList {
public:
ListNode* head;
int len;
LinkList() {
head = new ListNode();
len = 0;
}
~LinkList() {
ListNode* p = head;
ListNode* q;
while (p) {
q = p;
p = p->next;
delete q;
}
len = 0;
head = NULL;
}
ListNode* LL_index(int i);
int LL_insert(int i, int item);
int LL_delRepeat();
void LL_display();
};
ListNode* LinkList::LL_index(int i) {
ListNode* p = head;
if (i == 0) {//存在返回头指针的情况
return p;
}
int j = 1;
p = p->next;
while ((p != NULL) && (j < i)) {
p = p->next;
j++;
}
return p;
}
int LinkList::LL_insert(int i, int item) {
if ((i <= 0) || (i > len + 1)) {
return 0;
}
ListNode* p = LL_index(i - 1);
if (p == NULL) {
return 0;
}
ListNode* s = new ListNode();
s->data = item;
s->next = p->next;
p->next = s;
len++;
return 1;
}
int LinkList::LL_delRepeat() {
ListNode* p = head->next;//指向第一位有效位
int n = len;
while(p){//从当前走到表长尽头
ListNode* q = p;//q就是p的复制版
ListNode* r = p->next;//指向之后的每一位
while (r) {
if (r->data == p->data) {
ListNode* s = r;//把s删了
q->next = r->next;//让q移动
r = r->next;//指向下一个
delete s;
n--;
}
else {
q = r;
r = r->next;
}
}
p = p->next;
}
return n;
}
void LinkList::LL_display() {
ListNode* p = head->next;
//cout << len << ":";
while (p != NULL) {
cout << " "<< p->data;
p = p->next;
}
cout << endl;
}
int main() {
int t;
cin >> t;
while (t--) {
int len;
LinkList mylist;
cin >> len;
for (int i = 1; i <= len; i++) {
int item;
cin >> item;
mylist.LL_insert(i, item);//把元素都存入
}
cout << mylist.LL_delRepeat() <<":";
mylist.LL_display();
}
return 0;
}