PAT.A1097 Deduplication on a Linked List

返回目录

在这里插入图片描述

样例(可复制)

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

注意点

  1. 如果出现段错误一般是数组越界,本人的Map[10100]一开始大小设置时少输入了个0就报这种错
#include<bits/stdc++.h>
using namespace std;

const int maxn=100010;
int Map[10100]={0};
struct Node{
	int add,data,next,order;
	bool flag1,flag2;//flag1表示该节点是否为有效节点,flag2表示该节点data是否出现过 
	Node(){flag1=false;flag2=true;};
}node[maxn];
bool cmp(Node a,Node b){
	if(a.flag1&&b.flag1){//两个节点都是有效节点 
		if(a.flag2!=b.flag2)return a.flag2<b.flag2;
		return a.order<b.order;
	}
	return a.flag1>b.flag1;
}
int main(){
	int start,n,add,data,next,order=0;
	cin>>start>>n;
	while(n--){
		scanf("%d %d %d",&add,&data,&next);
		node[add].add=add;
		node[add].data=data;
		node[add].next=next;
	} 
	for(int p=start;p!=-1;p=node[p].next){
		node[p].flag1=true;
		node[p].order=order++;
		if(Map[abs(node[p].data)]==0){
			Map[abs(node[p].data)]=1;
			node[p].flag2=false;
		}else{
			node[p].flag2=true;
		}
	}
	sort(node,node+maxn,cmp);
	for(int i=0;i<order;i++){
		if(i==order-1){
			printf("%05d %d -1\n",node[i].add,node[i].data);
			break;
		}
		if(!node[i].flag2&&node[i+1].flag2)printf("%05d %d -1\n",node[i].add,node[i].data);
		else printf("%05d %d %05d\n",node[i].add,node[i].data,node[i+1].add);		
	}
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小怪兽会微笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值