链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184
思路:模拟链表,开两个数组去分别保存去重后链表各节点地址以及被删除节点地址。结构体模拟原链表节点,结构体数组下标就是原链表各节点地址
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int M = int(1e5) * 2 + 5; 5 struct 6 { 7 int d, next; 8 }a[M]; 9 int add1[M], ptr1 = 0; 10 int add2[M], ptr2 = 0; 11 int main() 12 { 13 int head, n; 14 cin >> head >> n; 15 for (int i = 0; i < n; i++) 16 { 17 int add; 18 cin >> add; 19 cin >> a[add].d >> a[add].next; 20 } 21 22 23 bool vis[M] = { 0 }; 24 int p = head; 25 while (p != -1) 26 { 27 int num = abs(a[p].d); 28 if (!vis[num]) 29 { 30 vis[num] = 1; 31 add1[ptr1++] = p; 32 } 33 else 34 { 35 add2[ptr2++] = p; 36 } 37 p = a[p].next; 38 } 39 40 41 printf("%05d", head); 42 for (int i = 1; i < ptr1; i++) 43 { 44 printf(" %d %05d\n%05d", a[add1[i - 1]].d, add1[i], add1[i]); 45 } 46 printf(" %d -1\n", a[add1[ptr1-1]].d); 47 if (ptr2 > 0) 48 { 49 printf("%05d", add2[0]); 50 for (int i = 1; i < ptr2; i++) 51 { 52 printf(" %d %05d\n%05d", a[add2[i - 1]].d, add2[i], add2[i]); 53 } 54 printf(" %d -1\n", a[add2[ptr2 - 1]].d); 55 } 56 return 0; 57 }
备注:这也是一种很巧妙的链表实现方法,看到题解的时候被震惊到了