PAT L2-2 链表去重


输入格式:

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

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

Address Key Next

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

输出格式:

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


直接数组模拟链表。



#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include<map>
#include<algorithm>
#define inf 0x3f3f3f3f
#define LL __int64
#include<queue>
using namespace std;
struct node{
    int w,next;
}now[100010];
bool vis[100010];
int now1[100010],del1[100010];
int main(){
    int n,m,i,j,k,st,id,c,nt,s1,s2;
    while(~scanf("%d%d",&st,&n)){
        s2 = s1 = 0;
        for(i = 0;i < n;++ i){
            scanf("%d%d%d",&id,&c,&nt);
            now[id].w = c;
            now[id].next = nt;
        }
        memset(vis,false,sizeof(vis) );
        for(i = 0;i < n && (~st);++ i){
            int tmp = now[st].w;
            if(tmp < 0)
                tmp *= -1;
            if(!vis[ tmp ] ){
                now1[s1++] = st;
                vis[tmp] = true;
            }
            else
                del1[s2++] = st;
            st = now[st].next;
        }
        if(s1){
            for(i = 0;i < s1;++ i){
                if(!i)
                    printf("%05d %d",now1[i],now[ now1[i] ].w);
                else
                    printf(" %05d\n%05d %d",now1[i],now1[i],now[now1[i] ].w);
            }
            puts(" -1");
        }
        if(s2){
            for(i = 0;i < s2;++ i){
                if(!i)
                    printf("%05d %d",del1[i],now[ del1[i] ].w);
                else
                    printf(" %05d\n%05d %d",del1[i],del1[i],now[del1[i] ].w);
            }
            puts(" -1");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值