给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。
输入格式:
输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤105,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 −1 来表示。
随后 N 行,每行按以下格式描述一个结点:
地址 键值 下一个结点
其中地址
是该结点的地址,键值
是绝对值不超过104的整数,下一个结点
是下个结点的地址。
输出格式:
首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。
输入样例:
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
数组解法就是内存开辟的多,但是省时间
#include<bits/stdc++.h>
using namespace std;
int a[100010];//关键词
int key[100010];//下一节点
int key1[100010];//重复
int key2[100010];//去重
int main()
{
int m, n;
cin >> m >> n;
while (n--)
{
int m1, m2, m3;
cin >> m1 >> m2 >> m3;
a[m1] = m2;
key[m1] = m3;
}
int p = 0;
while (m != -1)
{
cout << setw(5) << setfill('0') << m;
cout << " " << a[m] << " ";
key1[abs(a[m])] = 1;
L1: m = key[m];//寻找下一节点
if (m != -1)
{
if (key1[abs(a[m])] == 1)
{
key2[p++] = m;//去掉的重复链表
goto L1;//重复找下一节点
}
}
if (m != -1) cout << setw(5) << setfill('0') << m << endl;
else cout << m << endl;
}
for (int i = 0; i < p; i++)
{
cout << setw(5) << setfill('0') << key2[i];
cout << " " << a[key2[i]] << " ";
if (i < p - 1)cout << setw(5) << setfill('0') << key2[i + 1] << endl;
else cout << -1 << endl;
}
return 0;
}
L1 :那个地方一开始错了好几回 加上 m!=1 就对了