pta链表题均是排序题。
将所有信息按下标存入结构体数组中,按链表序遍历并记录存储链表序。
在链表序上操作会很简单 用到了reverse函数
可参考【PTA/乙级】【1075】链表元素分类 (25 分)
测试样例:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
样例输出:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
A题代码:
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
const int N = 1e5 + 5;
struct node {
int addr, data, next;
int order = 0x3f3f3f3f; //链表序初始为无穷
bool operator<(const node& t)const {
return order < t.order;
}
}L[N];
int main()
{
int h, n, k, len = 0;
cin >> h >> n >> k;
for (int i = 0; i < n; i++)
{
int addr;
cin >> addr;
L[addr].addr = addr;
cin >> L[addr].data >> L[addr].next;
}
for (int i = h; i != -1; i=L[i].next) {
len++;
L[i].order = len; //链表序
}
sort(L, L + N);
for (int i = 0; i <= len - k; i+=k) {
reverse(L + i, L + i + k); //翻转函数
}
for (int i = 0; i < len; i++)
{
if (i != len - 1)
cout << setw(5) << setfill('0') << L[i].addr << ' ' << L[i].data << ' ' << setw(5) << setfill('0') << L[i + 1].addr << endl;
else
cout << setw(5) << setfill('0') << L[i].addr << ' ' << L[i].data << ' ' << -1 << endl;
}
return 0;
}