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

PAT-乙-1025 1025 反转链表 (25 分)_第1张图片
PAT-乙-1025 1025 反转链表 (25 分)_第2张图片

代码

#include 
#include 

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 v;
	int now = start;
	for(int i=0; i 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

注解

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

结果

PAT-乙-1025 1025 反转链表 (25 分)_第3张图片

你可能感兴趣的:(PAT-乙级)