題目
給定乙個常數 k
kk 以及乙個單鏈表 l
ll,請編寫程式將 l
ll 中每 k
kk 個結點反轉。例如:給定 l
ll 為 1→
\rightarrow
→ 2→
\rightarrow
→ 3→
\rightarrow
→ 4→
\rightarrow
→ 5→
\rightarrow
→ 6,k
kk 為 3
33,則輸出應該為 3→
\rightarrow
→ 2→
\rightarrow
→ 1→
\rightarrow
→ 6→
\rightarrow
→ 5→
\rightarrow
→ 4;如果 k
kk 為 4,則輸出應該為 4→
\rightarrow
→ 3→
\rightarrow
→ 2→
\rightarrow
→ 1→
\rightarrow
→ 5→
\rightarrow
→ 6,即最後不到 k
kk 個元素不反轉。
輸入格式
每個輸入包含 1 個測試用例。每個測試用例第 1 行給出第 1 個結點的位址、結點總個數正整數 n(≤
105)
n(\le10^5)
n(≤10
5)、以及正整數 k(≤
n)k(\le n)
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題目分析33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
題目考察鍊錶反轉,採用單鏈表更方便;
仔細分析題目,結點的位址是 5 位非負整數,而結點總個數正整數 n(≤
105)
n(\le10^5)
n(≤10
5),我們給每個結點編號,並且編號從 0 開始,那麼編號的範圍在[0,
99999
][0, 99999]
[0,999
99],剛好對應105
10^5
105維的陣列,因此可採用靜態鍊錶,這樣做就無需建立鍊錶的過程。
採用靜態鍊錶還有乙個原因,題目輸入陣列是無序的,要建立鍊錶,就必須將輸入資料存放到陣列,而靜態鍊錶正是通過陣列實現,這應該就是出題人意圖所在。
演算法分析
首先需要遍歷一遍整數鍊錶,時間複雜度為n
nn,同時每遍歷k
kk個結點,又要迴圈k
kk次實現反轉,因此整個時間複雜度為o(n
×k)o(n\times k)
o(n×k)
;空間複雜度為o(n
)o(n)
o(n)
。**
#include
#include
using
namespace std;
const
int maxsize =
100000
;struct node
;void
reverse
(node *node,
int&head,
int k)
else
count--;}
node[l]
.next = tmp;
if(root ==-1
) head = p;
else
node[root]
.next = p;
root = l;
} p = tmp;}}
intmain()
reverse
(node, head, k)
;int p = head;
while
(p !=-1
)return0;
}
提交結果
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 個測試用例。每...
1025 反轉鍊錶 (25 分)
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 個元素不反轉。輸入格式 每...
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 個測試用例。每...