问题 F: 算法2-25 有序单链表删除重复元素
时间限制: 30 Sec 内存限制: 128 MB
献花: 30 解决: 17
[献花][花圈][TK题库]
题目描述
根据一个递增的整数序列构造有序单链表,删除其中的重复元素
输入
输入包括多组测试数据,每组测试数据占一行,第一个为大于等于0的整数n,表示该单链表的长度,后面跟着n个整数,表示链表的每一个元素。整数之间用空格隔开
输出
针对每组测试数据,输出包括两行,分别是删除前和删除后的链表元素,用空格隔开
如果链表为空,则只输出一行,list is empty
样例输入
5 1 2 3 4 5
5 1 1 2 2 3
0
样例输出
1 2 3 4 5
1 2 3 4 5
1 1 2 2 3
1 2 3
list is empty
#define _CRT_SECURE_NO_WARNINGS
#include <unordered_map>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <map>
using namespace std;
typedef struct LNode
{
int data;
LNode * next;
}LNode, *LinkList;
void CreateLink(LinkList &L,int n)
{
L = new LNode;
L->next = NULL;
int data;
LinkList p = L, q;
if (n == 0)
printf("list is empty\n");
else
{
for (int i = 0; i < n; ++i)
{
scanf("%d", &data);
q = new LNode;
q->data = data;
q->next = NULL;
p->next = q;
p = q;
printf("%d ", data);
}
printf("\n");
}
}
void DestoryList(LinkList &L)
{
LinkList p = L,q;
L = NULL;
while (p)
{
q = p->next;
delete p;
p = q;
}
}
void GetRidSameElem(LinkList & L)
{
LinkList p = L;
if (p->next)
p = p->next;
else
return;
LinkList q = p->next,tmp;
while (p && q)
{
if (p->data == q->data)
{
tmp = q;
q = q->next;
p->next = q;
delete tmp;
}
else
{
p = p->next;
q = q->next;
}
}
}
void PrintList(const LinkList L)
{
LinkList p = L->next;
if (p)
{
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
int main()
{
#ifdef _DEBUG
freopen("data.txt", "r+", stdin);
#endif // _DEBUG
int n;
LinkList L;
while (EOF != scanf("%d", &n))
{
CreateLink(L,n);
GetRidSameElem(L);
PrintList(L);
DestoryList(L);
}
return 0;
}
/**************************************************************
Problem: 3597
User: Sharwen
Language: C++
Result: 升仙
Time:67 ms
Memory:4744 kb
****************************************************************/