這題之前因為沒有ac所以跳過了,現在回來補坑~
資料結構部分:
很明顯這題需要空間換時間的思路,使用陣列快速隨機訪問,我是採用結構體陣列儲存的,我看其他大神也有用3個陣列分別儲存資料的,可能操作起來更加方便吧。個人覺得用結構體會讓資料更加一體化便於管理,實現起來更加直觀一些。
結構體內容:資料域data、指標域next均為int型。
按照題目要求資料量小於
資料輸入:
輸入結點時先識別輸入到哪個位址。
再輸入該位址的資料和next指標。
將用不到的10000設為頭節點,鏈結到題目的首結點前。
因為資料中可能會有不在鍊錶內的結點,輸入後從頭遍歷一遍鍊錶,修正結點數n的值。
本題核心——分段倒序:
需要倒序的片段共有n/k段,k為1無需倒序。
從每段的第二個結點開始使用使用頭插法,該方法需要有3個指標,頭節點,當前結點的前驅,當前結點,每個結點插入完成後,前驅與頭節點位置不變,當前結點變為前驅結點的下乙個。每段結束後,頭節點改為前驅結點,前驅結點後移一位。直至完成n/k輪。
輸出 格式化我覺得printf還是比cout配合好寫一些。固定位數補0即"%0nd"。
注意-1位址不用格式化,直接輸出-1。
問題解決~話說每次看到大佬用了自己一半的行數就寫完了內心就有種淡淡的憂傷~
#include using namespace std;
struct nodenode[100001];//靜態鍊錶,100000作頭節點
int main()
node[100000].next = l;
//更正結點數量
n = 1;
while(node[l].next>-1)
//倒序輪次n/k,每次從第二個開始倒
int p = 100000 ,q, r = node[100000].next;
for(int i=0;i
p = r;
r = node[p].next;
}l = node[100000].next;
//按照格式要求輸出鍊錶
for(int i=0;i
l = node[l].next;
}return 0;
}
PAT 乙級 1025 反轉鍊錶
給定乙個常數 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 個測試用例。每個測試用例...
PAT 乙級 1025 鍊錶反轉
給定乙個常數 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 個測試用例。每個測試用例...
PAT乙級 1025 反轉鍊錶
問題描述 給定乙個常數 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 個測...