把链表按地址排序,再反转k个节点
const int N = 100005;
struct st {
int add, data, next;
}a[N], *b[N];
int main() {
int head, n, k;
cin >> head >> n >> k;
for(int i = 0; i < n; i ++) {
int address, data, next;
cin >> address >> data >> next;
a[address].add = address;
a[address].data = data;
a[address].next = next;
}
int j = 0;
for(int i = head; i != -1; i = a[i].next) { //排序
b[j] = &a[i];
j ++;
}
reverse(b, b + k); //反转
for(int i = 0; i < j; i ++) {
if(i != j - 1) {
printf("%05d %d %05d\n", b[i] -> add, b[i] -> data, b[i + 1] -> add);
}
else {
printf("%05d %d -1\n", b[i] -> add, b[i] -> data);
}
}
return 0;
}
注意的点:
输入时要将每个节点放在它对应地址的下标上,也就是 数组下标要等于节点地址,便于排序时按照下标索引出来
输出时要排除不在链表中的点,排序时已经得到链表中有j个有效点,就要输出j个,因为输入的n个点有可能没有连在链表中
输出格式,输出本节点的地址,本节点的数字,下一节点的地址作为本节点的下一节点地址;如遇最后一个节点,下一节点地址要改为-1
不明白提示。。反转代码有问题,修改为:
for (i = 0; i <= j - k; i += k) { //反转,<= 假设有k = j = 4,也应该翻转一次。
reverse(b + i, b + i + k);
}