CCCC L2-002 链表去重

链接: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
%05d", a[add1[i - 1]].d, add1[i], add1[i]);
45     }
46     printf(" %d -1
", 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
%05d", a[add2[i - 1]].d, add2[i], add2[i]);
53         }
54         printf(" %d -1
", a[add2[ptr2 - 1]].d);
55     }
56     return 0;
57 }

备注:这也是一种很巧妙的链表实现方法,看到题解的时候被震惊到了

————————————————
心里有光,哪儿都美
原文地址:https://www.cnblogs.com/harutomimori/p/10539574.html