对于绝对值相等的数,只保留第一个,删除后面的。删除的元素也要串成一个链,以-1结尾。
我加了一个空的头,为了好统一的处理。
#include <iostream>
#include <vector>
#define MAX 100010
#define null -1
using namespace std;
struct Node{
int data;
int next;
};
Node LinkList[MAX];
bool isVis[MAX];
int n;
int head = MAX - 1;
vector <int> Del;
int Postive(int n) {
return n > 0 ? n : -n;
}
int main() {
cin >> LinkList[head].next >> n;
int add, data;
for (int i = 0; i < n; i++) {
scanf("%d", &add);
scanf("%d%d", &LinkList[add].data, &LinkList[add].next);
}
int pre = head, p = LinkList[pre].next;
while (p != null) {
if (!isVis[Postive(LinkList[p].data)]) {
isVis[Postive(LinkList[p].data)] = true;
pre = p;
p = LinkList[p].next;
}
else {//要被删除
Del.push_back(p);
LinkList[pre].next = LinkList[p].next;
p = LinkList[p].next;
}
}
p = LinkList[head].next;
while (p != null) {
printf("%05d %d ", p, LinkList[p].data);
if (LinkList[p].next == null)
printf("%d\n", LinkList[p].next);
else
printf("%05d\n", LinkList[p].next);
p = LinkList[p].next;
}
if (Del.size() != 0) {
pre = Del[0];
if (Del.size() == 1) {
LinkList[pre].next = null;
}
else {
for (int i = 1; i < Del.size(); i++) {
p = Del[i];
LinkList[pre].next = p;
pre = p;
}
}
LinkList[p].next = null;
p = Del[0];
while (p != null) {
printf("%05d %d ", p, LinkList[p].data);
if (LinkList[p].next == null)
printf("%d\n", LinkList[p].next);
else
printf("%05d\n", LinkList[p].next);
p = LinkList[p].next;
}
}
return 0;
}