分析:通過輸入輸出的樣例可以知道,數據的存儲不是真正的鏈表,通過思考觀察不難想出用結構體數組來模擬鏈表,其中每個節點的地址用數組的下標來表示。知道怎樣存儲後接下來就是怎麼去重,這裏去重採用的標記的辦法,既若該key值的絕對值第一次出現就將他標記,後面遍歷鏈表若發現該key值已被標記則說明該key值代表的節點需要刪去,這裏用vol[100001]數組來進行標記,key值爲數組的下標,刪去的節點按順序存儲其地址和key值與add[100001]和key[100001]數組中。最後按要求輸出
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
struct Node {
int key;
int rear;
};
int val[100001]; int add[100001]; int key[100001];
int main() {
//初始化,讀入數據
int ad, N;
cin >> ad >> N;
Node l[100001];
for (int i = 0; i<100001; i++) {
val[i] = 0;
}
int address, data, r;
for (int i = 0; i<N; i++) {
cin >> address >> data >> r;
l[address].key = data;
l[address].rear = r;
}
//遍歷查重
int index = 0;
int f = ad;//f爲要刪去節點的前驅節點地址
for (int i = ad; i != -1; i = l[i].rear) {
if (val[abs(l[i].key)] == 0) {
val[abs(l[i].key)] = 1;
f = i;
}
else {
add[index] = i;
key[index] = l[i].key;
l[f].rear = l[i].rear;
index++;
}
}
//遍歷輸出
for (int i = ad; i != -1; i = l[i].rear) {
printf("%05d %d ", i, l[i].key);
if (l[i].rear == -1)cout << -1 << endl;
else printf("%05d\n", l[i].rear);
}
for (int i = 0; i<index; i++) {
printf("%05d %d ", add[i], key[i]);
if (i != index - 1)printf("%05d\n", add[i + 1]);
else cout << -1 << endl;
}
return 0;
}