【CCCC】L2-002 链表去重 (25分),,把一个链表拆成两个
problem
L2-002 链表去重 (25分)
给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。
输入格式:
输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤10
5
,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 −1 来表示。
随后 N 行,每行按以下格式描述一个结点:
地址 键值 下一个结点
其中地址是该结点的地址,键值是绝对值不超过10
4
的整数,下一个结点是下个结点的地址。
输出格式:
首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。
输入样例:
00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854
输出样例:
00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1
- 题意:给出一个链表,按照键值拆成两个,分别输出
solution
- 用map<int,node>或node li[maxn]存原始链表节点。(必须先存完才能遍历)
- 遍历一遍原始链表,按照键值重复分成l1,l2两类。
- 输出时已经按顺序,直接输下一节点的开始地址即可(这样就不用去更新每个节点下一个节点的地址值了)。
#include<bits/stdc++.h>
using namespace std;
struct node{ int address, key, next;};
map<int,node>ma;//list
bool exsit[100010];
vector<node>l1,l2;//ans
int main(){
//input
int begin, n;
cin>>begin>>n;
for(int i = 0; i < n; i++){
int x; cin>>x;
cin>>ma[x].key>>ma[x].next;
}
//solve
for(int i = 0; i < n; i++){
node t; t.address = begin, t.key = ma[begin].key, t.next = ma[begin].next;
if(!exsit[abs(ma[begin].key)]){
exsit[abs(ma[begin].key)] = 1;
l1.push_back(t);
}else{
l2.push_back(t);
}
begin = ma[begin].next;
if(begin==-1)break;
}
//output
for(int i = 0; i < l1.size(); i++){
printf("%05d %d ", l1[i].address,l1[i].key);
if(i != l1.size()-1)
printf("%05d\n", l1[i+1].address);
else
printf("-1\n");
}
for(int i = 0; i < l2.size(); i++){
printf("%05d %d ", l2[i].address,l2[i].key);
if(i != l2.size()-1)
printf("%05d\n", l2[i+1].address);
else
printf("-1\n");
}
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
文章来源: gwj1314.blog.csdn.net,作者:小哈里,版权归原作者所有,如需转载,请联系作者。
原文链接:gwj1314.blog.csdn.net/article/details/108903968
- 点赞
- 收藏
- 关注作者
评论(0)