原題:
實現思路: 解決本題有2個關鍵點,第1個是怎麼把一堆打亂的鍊錶節點, 按照頭結點開始,
排好序.第2個是給我們按順序的一組數字, 再給個k, 我們怎麼對這組數進行正確翻轉.
也就是先解決:
輸入
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
輸出
00100 1 12309
12309 2 33218
33218 3 00000
00000 4 99999
99999 5 68237
68237 6 -1
然後解決:
假設 k = 3
輸入: 1 2 3 4 5 6 7 8 9
輸出 3 2 1 6 5 4 8 9
第1個關鍵點, 可以採用開乙個10萬空間的陣列, 讓address
成為陣列下標, 這樣我們對陣列按照
頭結點順序排序時, 時間複雜只為n, 遍歷一遍即可完成排序.
第2個關鍵點, 比較容易, 在草稿紙上找找規律, 不難寫出.
注意本題最後乙個測試的坑: 輸入可能存在"報廢節點", 所以錄入資料時我們要檢查next
是否已經
等於-1, 不能認為給n個資料, 鍊錶中就一定有n個資料.
版本1: 倒數第2個測試點執行超時, 無法ac
#include #include struct node ;
typedef struct node s_node;
int find (s_node nd, int n, int addr);
void reverse (int source, int dest, int k, int n);
int main ()
// 按照順序, 進行排序賦值
for (i=1; i<=n; i++)
}free(temp);
for (i=1; i<=n; i++)
// 反轉序號
reverse(stnum, renum, k, n);
// 根據反轉後的序號, 調整nd
for (i=1; i<=n-1; i++)
// 最後乙個數單獨列印
j = renum[n];
printf("%05d %d %d\n", nd[j].address, nd[j].data, -1);
return 0;
}// 返回位址是addr的節點下標
int find (s_node nd, int n, int addr)
}return pos;
}void reverse (int source, int dest, int k, int n)
}// 最後不夠的數, 加入末尾
if (i != n) }}
版本2: 完整c語言實現 - 可以ac
參考:
#include #include struct node ;
typedef struct node s_node;
void reverse (int source, int dest, int k, int n);
int main ()
// 從頭位址開始, 按順序賦值
for (i=1; i<=n; i++)
}free(temp); // 用不到了
for (i=1; i<=n; i++)
// 反轉序號
reverse(stnum, renum, k, n);
// 根據反轉後的序號, 調整nd, 也就是調整列印順序
for (i=1; i<=n-1; i++)
// 最後乙個數單獨列印
j = renum[n];
printf("%05d %d %d\n", nd[j].address, nd[j].data, -1);
return 0;
}void reverse (int source, int dest, int k, int n)
}// 最後不夠的數, 加入末尾
1025 反轉鍊錶 25
給定乙個常數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個結點的位址 結點...
1025 反轉鍊錶 25
define crt secure no warnings include include include include include include using namespace std int main int p start stacks,q 之前的想法中,每滿足k個,就輸出棧內的元素和...
1025 反轉鍊錶 25
時間限制 300 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 給定乙個常數k以及乙個單鏈表l,請編寫程式將l中每k個結點反轉。例如 給定l為1 2 3 4 5 6,k為3,則輸出應該為3 2 1 6 5 4 如果k為4,則輸出應該為...