PAT_B_1025 反轉連結串列 (25 分)【最後兩個測試點】
阿新 • • 發佈:2019-01-11
最後兩個測試點出錯的原因是:不是所有的結點都有效!不是所有的結點都有效!不是所有的結點都有效!(真坑人)
給定一個常數 K 以及一個單鏈表 L,請編寫程式將 L 中每 K 個結點反轉。例如:給定 L 為 1→2→3→4→5→6,K 為 3,則輸出應該為 3→2→1→6→5→4;如果 K 為 4,則輸出應該為 4→3→2→1→5→6,即最後不到 K 個元素不反轉。
輸入格式:
每個輸入包含 1 個測試用例。每個測試用例第 1 行給出第 1 個結點的地址、結點總個數正整數 N (≤105)、以及正整數 K (≤N),即要求反轉的子鏈結點的個數。結點的地址是 5 位非負整數,NULL 地址用 −1 表示。
接下來有 N 行,每行格式為:
Address Data Next
其中 Address
是結點地址,Data
是該結點儲存的整數資料,Next
是下一結點的地址。
輸出格式:
對每個測試用例,順序輸出反轉後的連結串列,其上每個結點佔一行,格式與輸入相同。
輸入樣例:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
輸出樣例:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
#include <iostream> #include <stdio.h> using namespace std; typedef struct node { int prevadd; int nextadd; int data; node* next; }node; int main() { int startadd, n, k; scanf("%d %d %d",&startadd,&n,&k); int countn=0; //統計有效結點,否則最後兩個測試點會報錯 node* List = new node; node* FinList = new node; List->next = NULL; node* p = new node; node* pre = new node; int prevadd, data, nextadd; int prevaddTemp=startadd; p = List; for (int i = 0; i<n; i++) { node* num = new node; num->next = NULL; scanf("%d %d %d",&prevadd,&data,&nextadd); //用scanf和printf,不然5會超時 num->prevadd = prevadd; num->data = data; num->nextadd = nextadd; p->next=num; p=p->next; } node* fpre=new node; fpre=FinList; pre=List; p=List->next; while(prevaddTemp != -1) { if(p==NULL) {pre=List;p=List->next;} if(p->prevadd==prevaddTemp) { fpre->next=p; pre->next=p->next; p->next=NULL; p=pre->next; fpre=fpre->next; prevaddTemp=fpre->nextadd; countn++; continue; } pre=p; p=p->next; } n=countn; node* head=new node; pre = FinList->next; p = pre->next; head=FinList; int flag=n/k; while (flag!=0) { for (int i = 1; i<k; i++) { pre->next = p->next; p->next = head->next; head->next = p; p = pre->next; } head=pre; pre = p; if(p!=NULL) p = p->next; n -= k; flag=n/k; } pre = FinList->next; p=pre->next; int m=countn-n; int mo=0; while (pre != NULL) { if(mo<m&&p!=NULL) pre->nextadd=p->prevadd; if(p==NULL) pre->nextadd=-1; printf("%05d %d ",pre->prevadd,pre->data); if (p!=NULL) printf("%05d\n",pre->nextadd); else printf("%d\n",pre->nextadd); pre=p; if(p!=NULL) { p = p->next; } mo++; } return 0; }