PAT A1097 Deduplication on a Linked List (25分)

前言

传送门

正文


参考题解

#include<iostream>
#include<algorithm>
#include<climits>
using namespace std;
/* 题意: 将单链表中的绝对值重复的结点分离出去单独做一条链表(只保留第一个),最后 输出分离后的原链表,以及该被分离出去的链表 思路:依旧照着静态链表五个步骤的模板走,值得注意的是,这次order,不仅需要区分有效结点和无效结点, 还需要区分被移除的结点,故order的初始值可由一般的N,变为2*N,而无效结点则从N开始。有效结点的order范围 就是在[0,N),被移除结点的范围则是在[N,2*N),而无效结点则是2*N, 这样再样通过一个排序函数即可将所有结点分为三部分, 从左到右依次是合法结点,被移除结点和非法结点。由于需要确定某个结点的data绝对值是否是第一次出现,故还需要 一个bool数组来标记。同时考虑到最后有效结点和被移除的结点都要输出,故可以设置cntValid和cntRemove来分别对 两条链表的结点个数进行计数 注意: 1、题目可能有无效结点 2、输出链表的时候,注意最后一个结点的next直接输出-1,不能用%05d输出 3、最好还是用scanf来读入数据,并且避免这样赋值node[addr]={addr,data,next,2*N} */

const int N=1e5+10;
bool exists[N];//exist[i]表示绝对值为i的是否出现过 
//步骤一 定义结构体数组 
struct Node{
	int addr,data,next;
	int order;//标记结点的序号,order==2*N表示是无效结点 
}node[N]; 
bool cmp(Node a,Node b){
	return a.order<b.order;
}
int main(){
	//步骤二 初始化 
	fill(exists,exists+N,false);//初始化时绝对值都未出现过 
	for(int i=0;i<N;i++)node[i].order=2*N;
	int head,n; 
	cin>>head>>n;
	int addr,data,next;
	//读入 
	for(int i=0;i<n;i++){
		cin>>addr>>data>>next;
		node[addr]={addr,data,next,2*N};//这里的2*N不能省略,不然测试点1错误 
	}
	//步骤三 枚举链表
	int p=head,cntValid=0,cntRemove=0; 
	while(p!=-1){
		if(!exists[abs(node[p].data)]){
			//首次出现
			node[p].order=cntValid++;
			exists[abs(node[p].data)]=true;
		}else{
			node[p].order=N+cntRemove;
			cntRemove++;
		}
		p=node[p].next;
	}
	//步骤四 排序筛选有效结点
	sort(node,node+N,cmp);
	//步骤五 输出 
	int cnt=cntValid+cntRemove;//总共输出的结点数
	for(int i=0;i<cnt;i++){
		if(i!=cnt-1&&i!=cntValid-1){//非最后一个结点
			printf("%05d %d %05d\n",node[i].addr,node[i].data,node[i+1].addr); 
		} else{
			printf("%05d %d -1\n",node[i].addr,node[i].data);
		}
	} 
	return 0;
} ~~~
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
3876次浏览 45人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16907次浏览 137人参与
# MiniMax求职进展汇总 #
25149次浏览 322人参与
# 春招至今,你的战绩如何? #
15716次浏览 144人参与
# 你的实习产出是真实的还是包装的? #
3051次浏览 53人参与
# 沪漂/北漂你觉得哪个更苦? #
1553次浏览 41人参与
# 巨人网络春招 #
11527次浏览 224人参与
# HR最不可信的一句话是__ #
1091次浏览 32人参与
# AI面会问哪些问题? #
946次浏览 23人参与
# 你做过最难的笔试是哪家公司 #
1247次浏览 22人参与
# AI时代,哪个岗位还有“活路” #
2853次浏览 51人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152905次浏览 889人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8021次浏览 43人参与
# XX请雇我工作 #
51155次浏览 171人参与
# 简历第一个项目做什么 #
32148次浏览 361人参与
# 简历中的项目经历要怎么写? #
311051次浏览 4265人参与
# 投格力的你,拿到offer了吗? #
178339次浏览 891人参与
# 你最满意的offer薪资是哪家公司? #
76981次浏览 375人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187605次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64730次浏览 886人参与
# 如果重来一次你还会读研吗 #
230018次浏览 2011人参与
# 正在春招的你,也参与了去年秋招吗? #
364353次浏览 2642人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务