題目
思路由於每個結點的位址都由數字給出,自然考慮使用靜態鍊錶;位址由於是5位數,則建立乙個容量為100001的l陣列,0~99999儲存結點,100000為頭指標;則結點的腳標即為結點的自身位址,要得到下乙個節點的指標只需要l[adress].next即可
錄入資料
使用結構node來儲存每個結點的資訊,node包含data成員和next成員,其自身位址直接用結點所在的陣列腳標表示,不再單獨儲存;
錄入時先錄入結點自己的位址,在根據結點自己的位址在對應位置錄入data和next資料
這裡雖然題目給出的位址都是五位數字,但是可以直接用%d錄入,錄入時數字前面的0會自動忽略掉;
翻轉鍊錶
(1)首先考慮如何處理邊界條件,這裡考慮使用限制翻轉次數的方式。在鍊錶長度為n,每次翻轉k個結點的前提下,總共翻轉n/k次,即可滿足題目要求
(2)根據上述條件設計翻轉函式,形參設計為需要被翻轉的部分鍊錶的頭指標和需要被翻轉的結點個數,函式內部使用頭插法翻轉鍊錶並保證不斷鏈。主函式則只需要從整個鍊錶的頭指標開始,反覆呼叫n/k次翻轉函式即可。
注意,這裡有乙個題中沒有說的隱含條件,用例給出的所有結點並不是都在鍊錶上的,會有一些無效結點,所有鍊錶長度n不能直接使用給出的結點個數,而是要在鍊錶構建好後自己統計一次;
列印資料
從頭指標開始依次列印即可,這裡再次用到%05d這個轉換說明,很有用,另外注意最後的尾指標-1要單獨列印;
#include
typedef
struct
node;
void
reverse
(node l,
int low,
int k)
//逆轉low之後的k個結點,low相當於被逆轉鍊錶的頭結點
}int
main
(void
)for
(n =-1
, p = fir; p !=-1
; p = l[p]
.next, n++);
//確定鍊錶有效結點的個數
p = fir;
if(k !=0)
}for
(p = l[fir]
.next; p !=-1
; p = l[p]
.next)
return0;
}
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 個測...