PAT-乙-1025 1025 反轉連結串列 (25 分)
阿新 • • 發佈:2018-12-15
程式碼
#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值給改了。