1025 反轉鍊錶 25 分

2021-09-29 12:38:22 字數 3602 閱讀 9510

題意描述:

給定乙個常數 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
輸出格式:對每個測試用例,順序輸出反轉後的鍊錶,其上每個結點佔一行,格式與輸入相同。

輸入樣例:

0010064

00000

499999

00100

112309

682376-

133218

300000

99999

568237

12309

233218

輸出樣例:

00000

433218

33218

312309

12309

200100

00100

199999

99999

568237

682376-

1

解題思路:bob: 鍊錶的東西我都忘光了,怎麼辦?┓( ´∀` )┏

alice: 忘了就重新學唄,還能咋辦。

bob: (撓頭)(小聲嘟囔)重新學豈不是很麻煩啊。

alice: 啥?

bob: (靈機一動)我有乙個不用鍊錶的寫法。只要輸出按照答案來就是了,我們可以用乙個動態陣列從這反轉之後的鍊錶中每個元素的位址和值,然後按照順序輸出就是了。這樣,我們沒有"反轉"鍊錶,而是直接記錄了鍊錶反轉後 輸出的順序。

alice: 你這是投機取巧,雖然不用修改鍊錶元素之間的指向關係,程式變得更簡單了。但是你這裡可能會用掉很多內容的。

bob: 對對對,我這種寫法相當於按照反轉的要求重新造了乙個新鍊錶,肯定會更耗記憶體的。

alice: 這次應該也有python版本了吧?

bob: 有的,以後也會補上正常反轉鍊錶的版本,這道題目還挺重要的,見過好幾次了。

**:

#include

#include

#include

using namespace std;

#define nn 100000

int data[nn][2

];// 儲存整個鍊錶,data[address][0]存值,data[address][1]存下個元素的位址,address即下標就是當前元素的位址。

intmain

(void

)// 讀入整個鍊錶

address = head_address;

int cnt =0;

vector<

int> addr_ans;

// 儲存反轉後的鍊錶的元素首位址

vector<

int> tmp;

// tmp 儲存鍊錶中的 k 個節點

while

(address !=-1

) address = data[address][1

];}// 如果還有剩下未反轉的元素也加進去

if(cnt >0)

// 按照順序輸出即可,注意在這裡已經用不到data[address][1]的值了,應為這裡記錄的是反轉之前的指向關係。

for(

int i=

0; i

size()

-1;++i)

printf

("%05d %d -1\n"

, addr_ans[addr_ans.

size()

-1], data[addr_ans[addr_ans.

size()

-1]]

[0])

;return0;

}

-python version:

def

main()

: tmp =

[int

(x)for x in

input()

.split()]

head_address = tmp[0]

n = tmp[1]

k = tmp[2]

nn =

100000

data =[[

0,0]

for x in

range

(nn)

]for x in

range

(n):

tmp =

[int

(x)for x in

input()

.split()]

data[tmp[0]

][0]

= tmp[1]

data[tmp[0]

][1]

= tmp[2]

address = head_address

cnt =

0 answer =

tmp =

while address !=-1

: cnt +=

1if cnt == k:

answer.extend(tmp[::

-1])

tmp =

cnt =

0 address = data[address][1

]if cnt >0:

answer.extend(tmp)

for x in

range

(len

(answer)-1

):print

(" {} "

.format

( answer[x]

, data[answer[x]][

0], answer[x +1]

))print

(" {} -1"

.format

(answer[-1

], data[answer[-1

]][0

]))if __name__ ==

'__main__'

: main(

)

易錯點:總結:

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