好久没来更新了,之前买了晴神宝典,推荐给大家,专门针对PAT的书,非常管用,最近感觉进步还可以,思路清晰多了
好了,然后这条题目,比较简单吧,静态链表,然后分割,我用了两个vector存的两个分割后的链表,map用来做已出现的数字的标记(记得取相反的),最后输出一下就好
#include<iostream>
#include<vector>
#include<map>
using namespace std;
const int maxn = 1e5 + 10;
struct Node {
int add, key, next;
}a[maxn];
int head, n;
vector<Node>q1, q2;
map<int, int>f;
int main()
{
scanf("%d%d", &head, &n);
int add, key, next;
for (int i = 0; i < n; i++)
{
scanf("%d%d%d", &add, &key, &next);
a[add].add = add, a[add].key = key, a[add].next = next;
}
for (int i = head; i != -1; i = a[i].next)
{
if (f.find(a[i].key) == f.end())f[a[i].key] = 1, f[-a[i].key] = 1,q1.push_back(a[i]);
else q2.push_back(a[i]);
}
if (q1.size())
{
for (int i = 0; i <= q1.size() - 1; i++)
{
printf("%05d %d ", q1[i].add, q1[i].key);
if (i != q1.size() - 1)printf("%05d\n", q1[i + 1].add);
else printf("-1\n");
}
}
if (q2.size())
{
for (int i = 0; i <= q2.size() - 1; i++)
{
printf("%05d %d ", q2[i].add, q2[i].key);
if (i != q2.size() - 1)printf("%05d\n", q2[i + 1].add);
else printf("-1\n");
}
}
return 0;
}