1052 Linked List Sorting (25 分)
题目分析
给我们一条链表,让我们根据结点值进行递增排序。链表采用的是静态存储的方式。
解题思路
首先我们需要一个结构体node
来存储结点,其中包括结点的关键字,地址,下一个结点的地址(所谓的地址就是一个五位的整数)。我们可以开一个100000大小的数组,把每个结点存储在地址对应的下标的位置,但是我更倾向于用map存储每个结点。这样可以应付地址位数更长的情况,避免数组开的太大。
将所有结点储存完毕之后,我们从首地址startAddress
开始对链表进行遍历,并将遍历到的结点储存在数组ans
中,一直到startAddress
等于-1为止,即链表结束。在这个过程中我们可以自动过滤掉不是本链表内的结点。然后就是根据关键字的值对每个结点进行排序。最后按照题意输出
需要提醒注意的一点就是,题目中给出的链表可能为空!我一开始一直没有注意到这点,没有进行特判,导致有一个结点一直出现段错误。
AC代码
#include <cstdio>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
struct node{
int key;
int next, ad;
node(){}
node(int _key, int _next, int _ad): key(_key), next(_next), ad(_ad) {}
};
unordered_map<int, node> address;
vector<node> ans;
int n, startAddress, cnt = 0;
bool cmp(node a, node b) {
return a.key < b.key;
}
int main() {
scanf("%d%d", &n, &startAddress);
int tempAddress, tempKey, tempNext;
for (int i = 0; i < n; ++i) {
scanf("%d %d %d", &tempAddress, &tempKey, &tempNext);
address[tempAddress] = node(tempKey, tempNext, tempAddress);
}
while(startAddress != -1) {
ans.push_back(address[startAddress]);
cnt++;
startAddress = address[startAddress].next;
}
sort(ans.begin(), ans.end(), cmp);
if (cnt == 0) // 这个特判很重要
printf("0 -1\n");
else {
printf("%d %05d\n", cnt, ans[0].ad);
for (int i = 0; i < ans.size(); ++i) {
if (i != ans.size() - 1) {
printf("%05d %d %05d\n", ans[i].ad, ans[i].key, ans[i + 1].ad);
} else
printf("%05d %d -1\n", ans[i].ad, ans[i].key);
}
}
return 0;
}