PAT-乙-1025 1025 反转链表 (25 分)

在这里插入图片描述
在这里插入图片描述

代码

#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值给改了。

结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhanggirlzhangboy/article/details/83065414