PTA 1052 Linked List Sorting

个人学习记录,代码难免不尽人意。

A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, you are supposed to sort the structures according to their key values in increasing order.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive N (<10 5) and an address of the head node, where N is the total number of nodes in memory and the address of a node is a 5-digit positive integer. NULL is represented by −1.

Then N lines follow, each describes a node in the format:

Address Key Next

where Address is the address of the node in memory, Key is an integer in −10 5,10 5, and Next is the address of the next node. It is guaranteed that all the keys are distinct and there is no cycle in the linked list starting from the head node.

Output Specification:

For each test case, the output format is the same as that of the input, where N is the total number of nodes in the list and all the nodes must be sorted order.

Sample Input:

5 00001

11111 100 -1

00001 0 22222

33333 100000 11111

12345 -1 33333

22222 1000 12345

Sample Output:

5 12345

12345 -1 00001

00001 0 11111

11111 100 22222

22222 1000 33333

33333 100000 -1

cpp 复制代码
#include <cstdio>
#include<algorithm>
using namespace std;
struct Node{
	int address;
	int next;
	int data;
	bool flag;
}node[100010];
bool cmp(Node a,Node b){
	if(a.flag==false||b.flag==false){
		return a.flag>b.flag;
	}else{
		return a.data<b.data;
	}
	
}
int main(){
   for(int i=0;i<100010;i++){
   	node[i].flag=false;
   }
   int n,begin;
   scanf("%d %d",&n,&begin);
   for(int i=0;i<n;i++){
   	int address,next;
   	int data;
   	scanf("%d %d %d",&address,&data,&next);
   	node[address].address=address;
   	node[address].data=data;
   	node[address].next=next;
   	//node[address].flag=true;这个地方不能直接赋true,因为题目中给的数据可能不在链表上! 
   } 
   int count=0;
   int p=begin;
   while(p!=-1){
   	node[p].flag=true;
   	count++;
   	p=node[p].next;
   } 
   if(count==0)
   printf("0 -1");
   else{
   	sort(node,node+100010,cmp);
   	printf("%d %05d\n",count,node[0].address);
   	for(int i=0;i<count;i++){
   		if(i!=count-1){
   			printf("%05d %d %05d\n",node[i].address,node[i].data,node[i+1].address);
		   }
		else{
			printf("%05d %d -1\n",node[i].address,node[i].data);
		}
	   }
   }
}

本题采用了静态链表的方法,需要注意的是在链表节点内部存储了其地址,因为链表排序只改变节点的next值,而其本身的address不发生改变。所以最后输出的时候,next输出的是物理存储上的下一个节点的address值而不是next值,需要习惯这种思维方式。

相关推荐
美团技术团队8 小时前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
To_OC1 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC1 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK1 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
_清歌2 天前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法
统计实现局2 天前
SVD 的三步走:双对角化、Givens 收敛、排序
算法
躬行见万象2 天前
《VLA 系列》UniLab 强化训练 | G1 机器人 |复现
算法
统计实现局2 天前
对称不定分解(Bunch-Kaufman):为什么 Cholesky 不够用
算法
统计实现局2 天前
dqrsl 拆解:拿着 QR 结果能算出哪 5 种东西
算法