PAT A1074 Reversing Linked List (25分)
阿新 • • 發佈:2020-09-01
題意:
給N個連結串列結點,以及K,對每K個長度的連結串列做逆置,輸出逆置後的連結串列。
題解:
不是很熟悉vector.reverse(),所以每次翻轉單獨處理,但是要注意最後一個結點指的地址可能會在下輪翻轉中變化,所以需要進行記錄。
注意%05d的輸出格式會使得-1的輸出出現問題,因此要分開考慮
還有一種思路是利用map做地址與儲存的對映,由於10^5的int map基本上不會超時
#include <cstdio> using namespace std; const int N = 100010; struct Node{ int v; int next; }node[N]; int main(){ int start,n,k; scanf("%d %d %d",&start,&n,&k); int add; for(int i = 0;i<n;i++){ scanf("%d" ,&add); scanf("%d %d",&node[add].v,&node[add].next); } int temp = start; int address[k];//存放即將反轉的連結串列的地址 bool flag = true; int time = 0; int lastend; while(temp!=-1){ if(time!=0) lastend = address[0]; for(int i = 0;i<k;i++){ address[i] = temp; if(temp == -1){ flag = false; break; } temp = node[temp].next; } if(flag==true){//未到底開始反轉 for(int i = 0;i < k ; i++){ if(i==0){ node[address[0]].next = temp; }else{ node[address[i]].next = address[i-1]; } } time++; }else{ break; } //更新start if(time==1){//第一次反轉 start = address[k-1]; }else{ node[lastend].next = address[k - 1]; } } while(start!=-1){ if(node[start].next!=-1) printf("%05d %d %05d\n",start,node[start].v,node[start].next); else printf("%05d %d %d\n",start,node[start].v,node[start].next); start = node[start].next; } }