代码
#include <iostream>
#include <vector>
using namespace std;
const int MAX = 100000;
struct node {
int id;
int data;
int next;
};
int main() {
int start, n, k;
scanf("%d %d %d", &start, &n, &k);
node nodeArray[MAX];
for(int i=0; i<n; i++) {
int id, data, next;
scanf("%d %d %d", &id, &data, &next);
nodeArray[id].id = id;
nodeArray[id].data = data;
nodeArray[id].next = next;
}
//original order
vector<node> v;
int now = start;
for(int i=0; i<n; i++) {
if(now!=-1) {
v.push_back(nodeArray[now]);
now = nodeArray[now].next;
}
}
//reverse order
vector<node> v2;
int startPos = 0;
while(startPos+k<=v.size()) {
for(int i=startPos+k-1; i>=startPos; i--) {
node tmp = v.at(i);
v2.push_back(tmp);
}
startPos += k;
}
while(startPos<v.size()) {
v2.push_back(v.at(startPos++));
}
for(int i=0; i<v2.size()-1; i++) {
node t = v2.at(i);
node tNext = v2.at(i+1);
printf("%05d %d %05d\n", t.id, t.data, tNext.id);
}
printf("%05d %d -1\n", v2.at(v2.size()-1).id, v2.at(v2.size()-1).data);
return 0;
}
注解
1、编号为5位数,不要少了前导0。
2、NULL为-1,并不是说只有最后一个node才为-1。next为-1的node可能不止一个,这样就会提前结束了。(处理不当的话,最后一个case会犯错误)
3、注意边界条件:node的个数刚好是反转的倍数时。eg: n=6, k=3。要反转两次,321654。仔细看看边界条件是否处理得当。
4、代码逻辑:nodeArray数组序号与node的id是一一对应的。eg:nodeArray[0].id=0,nodeArray[20].id=20。先按照start和next的顺序,把原始序列顺序放入v中。**特别注意:if(now!=-1)这个条件必不可少,否则最后一个案例错误。就是上面提及的那种情况,有不止一个节点的后继节点为空。**下面再创建v2,按照题目给定条件进行反转。主要是判断好,什么时候需要反转,什么时候不需要反转。最后按v2的顺序输出即可。输出时,next可以直接输出下一个节点的id(偷懒的做法)。正规做法还是把当前节点的next值给改了。