题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805369774129152
题目大意
给你一个链表的头结点,在这个链表中,重新输出链表使得不存在绝对值相等的结点(如果有相等的,只输出按链表顺序的第一个),那些被抛弃的点也组成新的链表输出。
分析
只说一下坑点吧:给的n个数不一定全用上,例如,给你10个数,但是从头结点开始的链表可能只有8个数,那么剩下的两个数不做处理,也就是说,只操作这8个数形成的链表,然后按题目的要求输出。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int s, n, x;
bool value[N];
struct node {
int add, data, nxt, cnt;
node() {
cnt = 2 * N;
}
}a[N];
bool cmp(const node x, const node y) {
return x.cnt < y.cnt;
}
int main() {
scanf("%d %d", &s, &n);
for(int i = 0; i < n; i++) {
scanf("%d", &x);
a[x].add = x;
scanf("%d %d", &a[x].data, &a[x].nxt);
}
int cnt1 = 0, cnt2 = 0;
int size = 0;
memset(value, 0, sizeof value);
for(int i = s; i != -1; i = a[i].nxt) {
if(value[abs(a[i].data)] == 0) {
value[abs(a[i].data)] = 1;
a[i].cnt = cnt1++;
} else {
a[i].cnt = N + cnt2++;
}
size++;
}
sort(a, a + N, cmp);
for(int i = 0; i < size; i++) {
if(i != cnt1 - 1 && i != size - 1)
printf("%05d %d %05d\n", a[i].add, a[i].data, a[i + 1].add);
else
printf("%05d %d -1\n", a[i].add, a[i].data);
}
return 0;
}