链表思考
L2-002 链表去重
给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。
输入格式:
输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤10
5
,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 −1 来表示。
随后 N 行,每行按以下格式描述一个结点:
#include<bits/stdc++.h>
using namespace std;
const int N= 100000 + 5;
struct nod {
int id, val, next;//
}zong[N];
int id_nod[N];//这个很重要,id是都知道的,那么如何找实际存储位置呢!,这么去找!
vector<int> del;
bool pan[N];
int main() {
int first, n;
cin >> first >> n;
for (int i = 0; i < n; i++) {
cin >> zong[i].id >> zong[i].val >> zong[i].next;
id_nod[zong[i].id] = i;
}
pan[abs(zong[id_nod[first]].val)]=1;
printf("%05d %d",zong[id_nod[first]].id,zong[id_nod[first]].val);
// cout << zong[id_nod[first]].id << " " << zong[id_nod[first]].val;
int index = zong[id_nod[first]].id;
for (int i = 0; i < n; i++) {
index = zong[id_nod[index]].next;
if(index==-1)break;
if (pan[abs(zong[id_nod[index]].val)] == 0) {
pan[abs(zong[id_nod[index]].val)] = 1;
printf(" %05d\n%05d %d", index, index, zong[id_nod[index]].val);
}
else {
del.push_back(index);
}
}
cout << " " << -1 << endl;
if (!del.empty()) {
printf("%05d %d",del[0],zong[id_nod[del[0]]].val);
// cout << del[0] << " " << zong[id_nod[del[0]]].val;
for (int i = 1; i < del.size(); i++) {
printf(" %05d\n%05d %d", del[i], del[i], zong[id_nod[del[i]]].val);
}
cout << " " << -1 << endl;
}
return 0;
}

浙公网安备 33010602011771号