Leetcode演算法 25 鍊錶分組反轉

2021-08-29 22:48:22 字數 2402 閱讀 7795

給定乙個鍊錶,每k個節點一組進行組內反轉,返回修改後的鍊錶。

其中:1、k是乙個正數,且小於等於列表的長度。

2、如果節點數不是k的整數倍,則最後剩餘的節點需要保持原樣。

3、只能使用常量的記憶體。

4、不能改變節點的值,只能修改節點本身。

示例:

輸入: 1->2->3->4->5

如果 k = 2, 則輸出: 2->1->4->3->5

如果 k = 3, 則輸出: 3->2->1->4->5

首先,需要知道組內反轉是如何操作的。

給出乙個鍊錶,p1 -> p2 -> p3,如果想將整個鍊錶反轉,操作如下:

接下來,便可以先進行分組,再進行組內反轉。

分組可以使用遞迴法來操作:只要剩餘鍊錶長度大於等於k,則將前k個進行反轉,然後繼續遞迴處理剩下的鍊錶。

class

listnode

:def

__init__

(self, x):if

isinstance

(x,list):

self.val = x[0]

self.

next

=none

head = self

for i in

range(1

,len

(x))

: head.

next

= listnode(x[i]

) head = head.

next

else

: self.val = x

self.

next

=none

defoutput

(self)

:'''

輸出鍊錶

'''result =

str(self.val)

head = self.

next

while

(head is

notnone):

result += f' -> '

head = head.

next

return

'('+ result +

')'def

reversekgroup

(head, k)

:"""

:type head: listnode

:type k: int

:rtype: listnode

遞迴,只要剩餘鍊錶長度大於等於k,則將前k個進行反轉,然後繼續處理剩下的鍊錶。

"""deffun_rec

(p):

''' :type p: listnode

從鍊錶p的下一位開始,每k個一組進行組內反轉。

'''# 鍊錶長度是否大於等於k

p0 = p

c =0while

(c < k and p.

next):

p = p.

next

c +=

1if c < k:

return p

pe = p # 將第k個儲存起來

pe2 = pe.

next

# 將第k+1個儲存起來

p1 = p0.

next

# 將第1個儲存起來,作為下一次遞迴的引數

p0.next

= pe # 首指標指向第k個

# 開始迴圈反轉前k個鍊錶

c =0 p = p1

next

= pe2

while

(c < k)

: p_next = p.

next

p.next

=next

next

= p p = p_next

c +=

1 fun_rec(p1)

# 繼續處理剩下的鍊錶

if k ==1or

not head:

return head

head0 = listnode(0)

head0.

next

= head

fun_rec(head0)

return head0.

next

if'__main__'

== __name__:

head = listnode([1

,2,3

,4,5

])k =

2print

(reversekgroup(head, k)

.output(

))

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 分)

給定乙個常數 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 個元素不反轉。輸入格式 每...