先走一遍,找出所有有效的链表节点,然后按要求将节点分成两组,然后输出
#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_set>
#include <cmath>
using namespace std;
struct Node{
int add, key, next;
Node(){}
Node(int a, int k, int n) : add(a), key(k), next(n){}
};
vector<Node> nodes(100005);
int main(){
int head, n;
scanf("%d%d", &head, &n);
for(int i = 0; i < n; ++i){
int add, key, next;
scanf("%d%d%d", &add, &key, &next);
nodes[add] = Node(add, key, next);
}
vector<Node> vec;
while(head != -1){
vec.push_back(nodes[head]);
head = nodes[head].next;
}
unordered_set<int> table;
vector<Node> out1, out2;
for(auto& v : vec){
if(table.find(abs(v.key)) != table.end()){
out2.push_back(v);
}else{
out1.push_back(v);
table.insert(abs(v.key));
}
}
for(size_t i = 0; i < out1.size(); ++i){
if(i+1 == out1.size()){
printf("%05d %d -1\n", out1[i].add, out1[i].key);
}else{
printf("%05d %d %05d\n", out1[i].add, out1[i].key, out1[i+1].add);
}
}
for(size_t i = 0; i < out2.size(); ++i){
if(i+1 == out2.size()){
printf("%05d %d -1\n", out2[i].add, out2[i].key);
}else{
printf("%05d %d %05d\n", out2[i].add, out2[i].key, out2[i+1].add);
}
}
return 0;
}