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;
class ListNode
{
public:
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->next;
delete p;
p = q;
}
len = 0;
head = NULL;
}
ListNode* Index(int i) {
ListNode* p = head;
while (i--)
{
p = p->next;
}
return p;
}
void CreateList(int n)
{
ListNode* p = head;
while (n--)
{
ListNode* q = new ListNode;
q->next = NULL;
cin >> q->data;
if (p->data != q->data)
{
p->next = q;
p = p->next;
}
else delete q;
}
}
void Deletedup(int n) //删除重复元素
{
ListNode* p, * q, * r, * l;
p = head;
while (p)//不要while(p->next),容易访问超限
{
q = p;
while (q->next)
{
if (q->next->data == p->data)
{
r = q->next; //重复结点,用r指向,删除r
q->next = r->next;
free(r);
}
else q = q->next;
}
p = p->next;
}
}
void Display() {
ListNode* p = head->next;
ListNode* t = head->next;
int len = 0;
while (t)
{
t = t->next;
len++;
}
delete t;
cout << len << ": ";
while (p)
{
cout << p->data << ' ';
p = p->next;
}
delete p;
cout << endl;
}
};
int main(void)
{
int t;
cin >> t;
while (t--)
{
LinkList L1;
int n;
cin >> n;
L1.CreateList(n);
L1.Deletedup(n);
L1.Display();
}
return 0;
}
日常提神醒脑环节: