L2-002. 链表去重

给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的结点。即对任意键值K,只有键值或其绝对值等于K的第一个结点可以被保留。同时,所有被删除的结点必须被保存在另外一个链表中。例如:另L为21→-15→-15→-7→15,则你必须输出去重后的链表21→-15→-7、以及被删除的链表-15→15。

输入格式:

输入第一行包含链表第一个结点的地址、以及结点个数N(<= 105 的正整数)。结点地址是一个非负的5位整数,NULL指针用-1表示。

随后N行,每行按下列格式给出一个结点的信息:

Address Key Next

其中Address是结点的地址,Key是绝对值不超过104的整数,Next是下一个结点的地址。

输出格式:

首先输出去重后的链表,然后输出被删除结点组成的链表。每个结点占一行,按输入的格式输出。

输入样例:

00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854

输出样例:

00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1

思路:比较水的题,用数组模拟链表,只需要操作链表,修改结点值就ok了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 struct node
 5 {
 6     int data;
 7     int next;
 8 };
 9 
10 node l[100000];
11 int visited[100000]={0};
12 
13 int main()
14 {
15     int address;
16     int first,n;
17     cin>>first>>n;
18     for(int i=0;i<n;i++)
19     {
20         cin>>address;
21         cin>>l[address].data>>l[address].next;
22     }
23     int p=first;
24     int q,first2=-1,flag=1,end;
25     int end1=first;
26     while(p!=-1)
27     {
28         q=l[p].next;
29         if(visited[abs(l[p].data)]==0)
30         {
31             visited[abs(l[p].data)]=1;
32             end1=p;
33         }
34         else
35         {
36             if(flag==1)
37             {
38                 flag=0;
39                 first2=p;
40                 end=p;
41                 l[end1].next=l[p].next;
42                 l[end].next=-1;
43             }
44             else
45             {
46                 l[end].next=p;
47                 end=p;
48                 l[end1].next=l[p].next;
49                 l[end].next=-1;
50             }
51         }
52         p=q;
53     }
54 //    l[end1].next=-1;
55     p=first;
56     while(p!=-1)
57     {
58         printf("%05d %d ",p,l[p].data);
59         if(l[p].next!=-1)
60         {
61             printf("%05d\n",l[p].next);
62         }
63         else
64         {
65             printf("-1\n");
66         }
67         p=l[p].next;
68     }
69     p=first2;
70     while(p!=-1)
71     {
72         printf("%05d %d ",p,l[p].data);
73         if(l[p].next!=-1)
74         {
75             printf("%05d\n",l[p].next);
76         }
77         else
78         {
79             printf("-1\n");
80         }
81         p=l[p].next;
82     }
83     return 0;
84 }

 

转载于:https://www.cnblogs.com/magicalzh/p/8658494.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值