1052 Linked List Sorting
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1052 Linked List Sorting相关的知识,希望对你有一定的参考价值。
1. 开始测试点4不通过,得分24/25,是忽略了所有节点都不在链表上的特殊情况。
2. 其实就是用静态链表,把结点根据值的大小,升序排列,所以一开始把每个结点的key赋值为超出最大值的maxn,是为了方便输出。
3. 并非给的所有结点都在链表上,用值inLink,并赋初始值为0,如果在链表上赋值为1,再在排序函数比较key之前比较inLink,这样确保输出的都是链表上的结点。
4. 在排序之后,把所有点的next赋值为下一个点的add,最后一个点的next赋值为-1。
AC代码
#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 100010;
struct Node{
int add,key = maxn,next;//key的初始值最大,方便排序时无效结点沉到下面
int inLink = 0;
}node[maxn];
bool cmp(Node a,Node b){
if(a.inLink!=b.inLink)return a.inLink>b.inLink;
else return a.key<b.key;
}
int main(){
int n,begin;
scanf("%d %d",&n,&begin);
int add;
while(n--){
scanf("%d",&add);
scanf("%d %d",&node[add].key,&node[add].next);
node[add].add = add;
}
//通过inLink赋值为1,筛除那些不在链上的点
int L = begin;
//也许所有结点都不在链表上呢
if(L==-1){
printf("0 -1\\n");
return 0;
}
int cnt = 0;
while(L!=-1){
node[L].inLink = 1;
cnt ++;
L = node[L].next;
}
sort(node,node+maxn,cmp);
for(int i=0;i<cnt-1;i++){
node[i].next = node[i+1].add;
}
node[cnt-1].next = -1;
printf("%d %05d\\n",cnt,node[0].add);
for(int i=0;i<cnt;i++){
printf("%05d %d",node[i].add,node[i].key);
if(node[i].next!=-1)printf(" %05d\\n",node[i].next);
else printf(" -1\\n");
}
return 0;
}
以上是关于1052 Linked List Sorting的主要内容,如果未能解决你的问题,请参考以下文章
PAT 1052 Linked List Sorting [一般]
1052 Linked List Sorting (25分)
PAT甲级1052 Linked List Sorting (25分)