給定乙個常數 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 (≤105)、以及正整數 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
(1)從輸入的結點當中篩選出有效結點,將結點按位址依次排好,並標上編號order,初始時order=maxn表示為無效結點;
(2)從首位址stad開始遍歷整個鍊錶,記錄每個有效結點在鍊錶中的序號order,將有效結點個數count賦值給n;
(3)將結點按序號進行排序,有效結點都在前面;
(4)將有效結點分塊,每塊k個結點,可分成n/k塊,若n%k不為0,則前n/k塊進行反轉,剩下的結點按順序輸出。列舉完整的塊,每一塊從後往前輸出結點資訊,要注意每一塊的最後乙個結點next的處理:
若當前處理的i號塊不是最後一塊完整塊,那麼最後乙個結點的next就是(i+2)*k-1號結點,也就是i+1的最後乙個結點。
若當前處理的是在最後一塊完整塊:如為n%k==0,則最後乙個結點next為-1;如n%k!=0,則後面還剩下一些結點,該塊最後乙個結點的next為(i+1)*k號結點,即剩餘的第乙個結點,在按順序輸出剩下的所有結點。
**如下:
#include
#include
using
namespace std;
const
int maxn=
100010
;struct nodenode[maxn]
;bool
cmp(node a,node b)
intmain()
int address;
for(
int i=
0;i)int p=stad,count=0;
while
(p!=-1
)sort
(node,node+maxn,cmp)
; n=count;
for(
int i=
0;i)//處理每一塊的最後乙個結點
printf
("%05d %d "
,node[i*k]
.adress,node[i*k]
.data );if
(ielse
else
else}}
}}return0;
}
//定義靜態鍊錶
struct nodenode[
100010
];
(2)程式開始時,對靜態鍊錶進行初始化。一般來說,需要對定義中的***進行初始化,將其定義為正常情況下達不到的數字(一般是小於所有能達到的數字):
for
(int i=
0;i)
(3)題目一般會給出一條鍊錶的首結點位址,可以根據這個位址遍歷整個鍊錶。這一步同時也是我們對結點性質***進行標記,並且對有效結點個數進行計數的時候。
int p=begin,count=0;
while
(p!=-1
)
(4)由於使用靜態鍊錶,是直接採用位址對映(hash)的方式。這就會使得陣列下標不連續。而很多時候題目給出的結點並不都是有效結點。為了能夠可控的訪問有效結點,一般都需要對陣列進行排序以把有效結點移到陣列左端,這樣就可以用步驟三得到的count來訪問他們。既然需要把有效結點移到前面,那麼就可以用之前定義的***來幫忙。於是再寫sort的排序函式cmp時,就可以在cmp的兩個引數結點中有無效節點時按***從大到小(或從小到大)排序。這樣就可以把有效節點全部移到數獨左端。
bool
cmp(node a,node b)
(5)經歷了步驟四,鍊錶中的有效結點就都在陣列左端了,且已經按結點的性質進行了排序。接下來就要看題目在排序之後具體要做什麼了。比較常見的是按各種不同的要求輸出鍊錶。 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 個測試用例。每...