PAT-A-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 (<105) 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 [−105,105], 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
解题思路:
(原始):一看到很多数据绑定在一起,也就是链表的操作,想到了结构体,到目前是对的。题目要求对key进行从小到大排序,然后按原格式输出。当时我一想,把所有的数据装到vector里面,使用sort对key从小到大排序,这样下标为0的就是key最小的,下标为size()-1的就是key最大的。然后使用一个循环,除了最后一项,每一项的元素的next=下一个元素的id。这样想没错吧,乍一看是完全没错的,甚至还有点为自己的小聪明高兴。还注意到了id是固定的五位数,使用int做输入,输出的时候注意使用scanf("%05d")来输出id。
但是第一次提交,大失所望。只对了两个测试用例(一共五个)。惊慌失措
(1)在牛客网找了测试用例后,找到一个低级错误,输出每一行的数据id。next的时候注意了格式化输出,但是在第一行输出头指针的时候竟然忘了,怪哉怪哉。
(2)输入检测,(此问题和下面小问可以连起来看,只要改动一下nodes的push位置就可以避免这个问题,但是因为我是一点点debug的,所以这里仅仅是作为纠错纪录)如果输入的头指针的-1,那就不需要后续计算了。直接输出。测试用例的边界问题
(3)因为我下面的算法属于投机取巧,并没有使用链表,所以出现了这样一个问题:题目所给的数据不全是一条链的,即存在两条链以上,因为我是直接把他们当做一条链来做排序,那结果肯定是错的(在这里再次佩服姥姥的测试用例的精湛之处以及对自己大脑简单的深深鄙视)。在此基础上改很好改,我们使用结构体数组,输入数据的时候直接把数据输入到结构体数组中,然后根据输入地址一直遍历到next=-1,遍历一个vector添加一个,后续不变。
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
struct node{
int id;
int key;
int next;
}data[100001]; //定义结构体数组,保存数据。
bool sortBykey(const node n1,const node n2){ //定义排序算法
return n1.key<n2.key;
}
int main(){
int address,n;
int a,b,c;
vector<node> nodes;
scanf("%d %d",&n,&address);
while(n--){ //保存数据
node nn;
scanf("%d %d %d",&a,&b,&c);
data[a].id=a;
data[a].key=b;
data[a].next=c;
}
if(address==-1){ //边界检验
printf("0 -1\n");
return 0;
}
while(address!=-1){ //得到头指针所指向链表的所有节点
nodes.push_back(data[address]);
address=data[address].next;
}
sort(nodes.begin(),nodes.end(),sortBykey); //排序
printf("%d %05d\n",nodes.size(),nodes[0].id); //格式化输出第一行数据
for(int i=0;i<nodes.size();i++){
if(i==nodes.size()-1){
nodes[i].next=-1; //最后一个节点next指针等于-1,其他节点的
//next指针等于下一个元素的id
printf("%05d %d %d\n",nodes[i].id,nodes[i].key,nodes[i].next);
break;
}else{
nodes[i].next=nodes[i+1].id;
}
printf("%05d %d %05d\n",nodes[i].id,nodes[i].key,nodes[i].next);
}
return 0;
}
上一篇: sorted() 排序函数
下一篇: Arrays类
推荐阅读
-
【LeetCode OJ 328】Odd Even Linked List
-
数据结构与算法 —— 链表linked list(04)
-
PTA 02-线性结构3 Reversing Linked List (25 分)
-
PAT-A1028 List Sorting【排序】
-
PAT-A-1052 Linked List Sorting
-
leetcode 328. Odd Even Linked List
-
leetcode 328. Odd Even Linked List
-
328. Odd Even Linked List
-
328. Odd Even Linked List。
-
328. Odd Even Linked List