給定乙個常數 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 (≤10^5)、以及正整數 k (≤n),即要求反轉的子鏈結點的個數。結點的位址是 5 位非負整數,null 位址用 −1 表示。
接下來有 n 行,每行格式為:
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這個題目著實卡了我好久,是乙個鍊錶的k位反轉問題。33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
我是直接寫了乙個node結構,首先按照address位址把每一行的address、data、next儲存到這個node結構裡,然後再進行反轉操作。
一開始我是寫了乙個sort方法把這個儲存上的node進行乙個按照位址的排序,然後在反轉,但是寫sort的時候我用的for迴圈,並且迴圈條件是i=0,i這裡需要注意的一點就是,題目的輸入不一定是全部連續的,也就是說它給了n個結點但是不一定這n個都能連成乙個鍊錶(暴風哭泣(;´д`)ゞ
所以才有了這中間的那個while迴圈,只push進去連續的鍊錶。
然後再用乙個reverse反轉外加輸出。
我的reverse是自己寫的,分了三種情況(以1->2->3->4->5->6反轉為例):
當前結點的下乙個指向前乙個結點。可能還有別的分情況,然鵝我感覺這個比較清晰,不過用algorithm裡面的reverse(i,i+k)可以直接反轉。比如 4->3->2->1->5->6 反轉中的 4->3 3->2 2->1
該輪反轉結束的最後乙個並且指向下一輪反轉
比如 3->2->1->6->5->4 反轉中的 1->6
該輪反轉結束後存在下一輪不反轉
比如 4->3->2->1->5->6 反轉中的 1->5
該輪反轉結束後不存在下一輪不反轉
比如 3->2->1->6->5->4 反轉中4結束
然後輸出,就okk了。
#include
#include
#include
using
namespace std;
struct node};
void
print
(node &node)
// 輸出node
void
reverse
(vector
&node,
int reverse)
// 反轉+輸出}if
(len%reverse !=0)
// 輸出不反轉的
}int
main()
vector l;
int adr = h_address;
while
(true
)// 找出其中有效鍊錶
reverse
(l, rev)
;}
PTA 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 個測試用例。每個測試用例...