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

PAT 1052 Linked List Sorting [一般]

1052 Linked List Sorting (25分)

PAT甲级1052 Linked List Sorting (25分)

PAT 1052. Linked List Sorting (25)

PAT1052 Linked List Sorting (25)(25 分)