首页 > 学院 > 开发设计 > 正文

团体程序设计天梯赛L2-002 链表去重

2019-11-06 08:38:51
字体:
来源:转载
供稿:网友

L2-002. 链表去重

时间限制300 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者陈越

给定一个带整数键值的单链表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 599999 -7 8765423854 -15 0000087654 15 -100000 -15 9999900100 21 23854输出样例:
00100 21 2385423854 -15 9999999999 -7 -100000 -15 8765487654 15 -1

#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <vector>#include <set>#include <stack>#include <map>#include <climits>using namespace std;#define LL long longconst int INF=0x3f3f3f3f;struct node{    int val;    int nt;}a[100005];int vis[100005];int ans1[100005],ans2[100005];int main(){    int x,n;    while(~scanf("%d %d",&x,&n))    {        int k;        for(int i=0;i<n;i++)        {            scanf("%d",&k);            scanf("%d %d",&a[k].val,&a[k].nt);        }        int cnt1=0,cnt2=0;        for(int i=x;i!=-1;i=a[i].nt)        {            int k=abs(a[i].val);            if(!vis[k]) vis[k]=1,ans1[cnt1++]=i;            else ans2[cnt2++]=i;        }        PRintf("%05d %d ",ans1[0],a[ans1[0]].val);        for(int i=1;i<cnt1;i++)        {            printf("%05d/n",ans1[i]);            printf("%05d %d ",ans1[i],a[ans1[i]].val);        }        printf("-1/n");        if(cnt2)        {            printf("%05d %d ",ans2[0],a[ans2[0]].val);            for(int i=1; i<cnt2; i++)            {                printf("%05d/n",ans2[i]);                printf("%05d %d ",ans2[i],a[ans2[i]].val);            }            printf("-1/n");        }    }    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表