1025 反轉鍊錶 25分

2021-10-03 17:07:35 字數 2492 閱讀 8318

給定乙個常數 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

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 個測試用例。每...