PAT乙級1025 反轉鍊錶 模擬鍊錶

2021-10-05 06:07:42 字數 2873 閱讀 7531

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

思路:用結構體+陣列模擬鍊錶。先將位址資料和next「指標」都放入結構體中當作結點,然後放入陣列中,利用乙個map,將位址對映結點來按順序放入陣列中。如題目樣例,排序後的結果是:

00100 1 12309

12309 2 33218

33218 3 00000

00000 4 99999

99999 5 68237

68237 6 -1

注意是按照位址排序。

然後利用reverse函式交換k個值,比如樣例中k是4,則將前4個結構體交換,變成

00000 4 99999

33218 3 00000

12309 2 33218

00100 1 12309

99999 5 68237

68237 6 -1

但是此時前乙個結點的next和下乙個結點的address並不符合,所以還需要再賦值一下。

注意點1:題目要求是每k個結點反轉,不足k的不反轉

注意點2:有的測試點會給出不在鍊錶中的結點,所以需要用乙個len來計數,而不能直接用vec.size()

注意點3:注意除了-1都要輸出前導0,而-1又是最後乙個,所以可以放到最後輸出

#include

#include

#include

#include

#include

using

namespace std;

struct listnode

;int

main()

int len =0;

int address = head_address;

vector vec;

while

(address !=-1

)for

(int i =

0; i <

(len - len % k)

; i +

= k)

//下面細說這一迴圈

reverse

(vec.

begin()

+ i, vec.

begin()

+ i + k)

;for

(int i =

0; i < len -

1; i++

) vec[i]

.next = vec[i +1]

.address;

vec[len -1]

.next =-1

;//將最後乙個結點的next賦為-1

for(

int i =

0; i < len -

1; i++

)printf

("%05d %d %05d\n"

, vec[i]

.address, vec[i]

.data, vec[i]

.next)

;printf

("%05d %d %d\n"

, vec[len -1]

.address, vec[len -1]

.data, vec[len -1]

.next)

;return0;

}

**中

for

(int i =

0; i <

(len - len % k)

; i +

= k)

reverse

(vec.

begin()

+ i, vec.

begin()

+ i + k)

;

參考了柳神的做法。實現題目中每k個結點反轉,不足k不反轉的條件

當len = k時,len % k = 0,所以len - len % k就是len本身長度;

當len < k時,len % k = len,len - len % k等於0,不足k所以不執行反轉;

當len > k時,len % k是剩下的不足k(即不反轉)的結點,而len - len % k是之前滿足超過k的結點;

而reverse函式會反轉[left, right)範圍的元素,注意是左閉右開,所以在題目中即[0, k - 1], [k, 2k - 1]…

建議理解完這題再自己做一下b1075 鍊錶元素歸類這題

PAT 乙級 1025 反轉鍊錶(模擬)

1025 反轉鍊錶 25 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個測試用例。每個測試...

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