PAT 1052 Linked List Sorting
对链表进行排序
需要注意给的数据中有一些节点不在链表中,如果对全数组排序时需要把它们排到后面(参考其他文章),或者按照本方法把在链表的元素安排到新数组里,然后对新数组排序
利用c++11的的std::move让noder[i]接管node[i]原值,速度会快一点
#include <cstdio>
#include <algorithm>
#include <utility>
#define MAXN 100005
struct Node{
int addr, key, next;
}node[MAXN], noder[MAXN];
bool cmp(const Node &a, const Node &b) {
return a.key<b.key;
}
int main() {
int n, st, addr, k, nex;
scanf("%d%d", &n, &st);
for (int i=0; i<n; i++) {
scanf("%d%d%d", &addr, &k, &nex);
node[addr].addr = addr, node[addr].key = k, node[addr].next=nex;
}
int count = 0, p = st;
while (p!=-1) {
noder[count++] = std::move(node[p]);
p=node[p].next;
}
if (count==0) {
printf("0 -1");
return 0;
}
std::sort(noder, noder+count, cmp);
printf("%d %05d\n", count, noder[0].addr);
for (int i=0; i<count; i++) {
if (i!=count-1) {
printf("%05d %d %05d\n", noder[i].addr, noder[i].key, noder[i+1].addr);
} else printf("%05d %d -1\n", noder[i].addr, noder[i].key);
}
return 0;
}