还是很简单的,虽然一开始没注意N==K的情况,但还是很顺利。
# include <iostream>
# include <vector>
using namespace std;
struct Node{
int now; // 记录当前节点的地址
int data;
int next;
}node[100010];
int N;
int K;
int start;
vector<Node> ND;
int main()
{
cin >> start >> N >> K;
for(int i=0;i<N;++i){
int now;
cin >> now;
node[now].now = now;
cin >> node[now].data >> node[now].next;
}
// 把链表按照顺序放入vector中
for(int p = start;p != -1;p=node[p].next)
ND.push_back(node[p]);
// 每K个结点进行翻转 记得i<=ND.size()-K而不是<号,这样当N == K也可以翻转整个链表
for(int i=0;i<=ND.size()-K;i+=K)
for(int j = 0;j < K/2;j++)
swap(ND[i+j], ND[i+K-1 - j]); // 交换前后的两个节点,直到遍历到当前链表序列一半就翻转完毕了
// 输出
for(int i=0;i<ND.size();++i){
if(i == ND.size() - 1)
printf("%05d %d -1\n", ND[i].now, ND[i].data);
else
printf("%05d %d %05d\n", ND[i].now, ND[i].data, ND[i+1].now);
}
return 0;
}