1025. 反轉連結串列 (25)
阿新 • • 發佈:2019-02-16
給定一個常數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
思路分析:建立一個10萬個元素的陣列,這道題我沒讀懂題= =被坑了好長時間,流著眼淚在除錯的說,“即最後不到K個元素不反轉”指的是無論有多少個節點,要反轉到n/k次,一直到剩下的元素不夠k了為止。。
程式碼如下:
#include <stdio.h> int node[100000][3]; int list[100000]; int main() { int n, k, start; while(scanf("%d%d%d", &start, &n, &k) != EOF) { for(int i = 0; i < n; i++) { int addr, data, next; scanf("%d%d%d", &addr, &data, &next); node[addr][0] = data, node[addr][1] = next; } list[0] = start; int last =start; int count = 1; for(int i = 1; i < n; i++) { node[last][2] = last; last = list[i] = node[last][1]; count++; if(node[last][1] == -1) break; } int s,e; s = 0; e = s + k; while(e <= count && e > s) { for(int j = e-1; j >= s; j--) { if(j == k-1) printf("%05d %d ", list[j], node[list[j]][0]); else printf("%05d\n%05d %d ", list[j], list[j], node[list[j]][0]); } s = e; e = s+k; } for(int j = s; j < count; j++) { if(j == 0) printf("%05d %d ", list[j], node[list[j]][0]); else printf("%05d\n%05d %d ", list[j], list[j], node[list[j]][0]); } printf("-1\n"); } return 0; }