1. 程式人生 > >PAT-乙-1025 1025 反轉連結串列 (25 分)

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

結果

在這裡插入圖片描述