L2-002. 链表去重

因为数值比较小,所以直接用数组来模拟

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 using namespace std;
 6 
 7 #define maxn 100005
 8 
 9 struct node
10 {
11     int key;
12     int next;
13 }a[maxn];
14 
15 int main()
16 {
17     int first,n,add;
18     scanf("%d%d",&first,&n);
19     for(int i=0;i<n;i++)
20     {
21         scanf("%d",&add);
22         scanf("%d%d",&a[add].key,&a[add].next);
23     }
24 
25     //去重:直接再开两个数组记录去重后两个链表的地址
26     int num,vis[10005]={0},t1=0,t2=0;
27     int a1[maxn],a2[maxn];
28     for(int i=first;i!=-1;i=a[i].next)
29     {
30         num=abs(a[i].key);
31         if(!vis[num])
32         {
33             vis[num]=1;
34             a1[t1++]=i;
35         }
36         else
37             a2[t2++]=i;
38 
39     }
40 
41     printf("%05d %d ",a1[0],a[a1[0]].key);
42     for(int i=1;i<t1;i++)
43     {
44         printf("%05d\n",a1[i]);
45         printf("%05d %d ",a1[i],a[a1[i]].key);
46     }
47     printf("-1\n");
48 
49     if(t2)
50     {
51         printf("%05d %d ",a2[0],a[a2[0]].key);
52         for(int i=1;i<t2;i++)
53         {
54             printf("%05d\n",a2[i]);
55             printf("%05d %d ",a2[i],a[a2[i]].key);
56         }
57         printf("-1\n");
58     }
59 
60     return 0;
61 }