对于绝对值相等的数,只保留第一个,删除后面的。删除的元素也要串成一个链,以-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("d %d ", p, LinkList[p].data); if (LinkList[p].next == null) printf("%d\n", LinkList[p].next); else printf("d\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("d %d ", p, LinkList[p].data); if (LinkList[p].next == null) printf("%d\n", LinkList[p].next); else printf("d\n", LinkList[p].next); p = LinkList[p].next; } } return 0; }
