题意
给出一个链表,要求负数值排在非负之前,[0,K]之间的数在前面,所有值原始顺序不变。
代码
- 分成三块分别存储结点,注意每块的结点数目都可能为0,所以会对每一块最后一个结点的next有影响。
- 更简单的写法是使用vector分块存储,最后合并直接输出,不用判断。
1. 原始代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 100010;
struct node {
int data;
int address;
int next;
} Node[maxn], negative_num[maxn], greater_num[maxn], positive_num[maxn];
int K;
int main() {
int st, n;
cin >> st >> n >> K;
for (int i = 0; i < n; ++i) {
int data, address, next;
scanf("%d", &address);
scanf("%d%d", &Node[address].data, &Node[address].next);
Node[address].address = address;
}
int p = st, cnt1 = 0, cnt2 = 0, cnt3 = 0, order = 1;
while (p != -1) {
Node[p].order = order++;
if (Node[p].data < 0) negative_num[cnt1++] = Node[p];
else if (Node[p].data <= K) positive_num[cnt2++] = Node[p];
else greater_num[cnt3++] = Node[p];
p = Node[p].next;
}
if (cnt1 != 0) {
for (int i = 0; i < cnt1 - 1; ++i) {
printf("%05d %d %05d\n", negative_num[i].address, negative_num[i].data, negative_num[i + 1].address);
}
if (cnt2 != 0) {
printf("%05d %d %05d\n", negative_num[cnt1 - 1].address, negative_num[cnt1 - 1].data, positive_num[0].address);
} else {
if (cnt3 == 0) {
printf("%05d %d -1\n", negative_num[cnt1 - 1].address, negative_num[cnt1 - 1].data);
return 0;
} else {
printf("%05d %d %05d\n", negative_num[cnt1 - 1].address, negative_num[cnt1 - 1].data, greater_num[0].address);
}
}
}
if (cnt2 != 0) {
for (int i = 0; i < cnt2 - 1; ++i) {
printf("%05d %d %05d\n", positive_num[i].address, positive_num[i].data, positive_num[i + 1].address);
}
if (cnt3 != 0) {
printf("%05d %d %05d\n", positive_num[cnt2 - 1].address, positive_num[cnt2 - 1].data, greater_num[0].address);
} else {
printf("%05d %d -1\n", positive_num[cnt2 - 1].address, positive_num[cnt2 - 1].data);
return 0;
}
}
if (cnt3 != 0) {
for (int i = 0; i < cnt3; ++i) {
if (i != cnt3 - 1) {
printf("%05d %d %05d\n", greater_num[i].address, greater_num[i].data, greater_num[i + 1].address);
} else {
printf("%05d %d -1\n", greater_num[i].address, greater_num[i].data);
return 0;
}
}
}
}
2. 修改后
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 100010;
struct node {
int data;
int address;
int next;
int order;
} Node[maxn], ans[maxn], negative_num[maxn], greater_num[maxn], positive_num[maxn];
int K;
int main() {
int begin, n;
vector<node> v, ans;
cin >> begin >> n >> K;
for (int i = 0; i < n; ++i) {
int data, address, next;
scanf("%d", &address);
scanf("%d%d", &Node[address].data, &Node[address].next);
Node[address].address = address;
}
for (; begin != -1; begin = Node[begin].next) {
v.push_back(Node[begin]);
}
for (int i = 0; i < v.size(); i++) {
if (v[i].data < 0) ans.push_back(v[i]);
}
for (int i = 0; i < v.size(); i++) {
if (v[i].data >= 0 && v[i].data <= K) ans.push_back(v[i]);
}
for (int i = 0; i < v.size(); i++) {
if (v[i].data > K) ans.push_back(v[i]);
}
for (int i = 0; i < ans.size() - 1; i++)
printf("%05d %d %05d\n", ans[i].address, ans[i].data, ans[i + 1].address);
printf("%05d %d -1\n", ans[ans.size() - 1].address, ans[ans.size() - 1].data);
return 0;
}