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