25. k个一组翻转链表
解法一:
class Solution:
def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
Head = ListNode(0)
Head.next = head
if k == 1:
return head
pre = j = Head
i = head
while j:
steps = 0
while j and steps < k: # j走k步
j = j.next
steps += 1
if j and steps == k: # 保证j走了k步
j = self.reverse(pre, i, j, k) #调用反转,并恢复j指向新链末尾
pre = j #更新pre
i = pre.next #更新i
return Head.next
# 反转begin到end的k个结点,并返回反转后的最后一个结点
def reverse(self, pre, begin, end, k):
work = begin.next # 从begin之后开始
begin.next = end.next #保持该段后继
for _ in range(k - 1): # 头插法(保持该段前驱为pre)
tmp = work
work = work.next
tmp.next = pre.next
pre.next = tmp
return begin # 反转后最后一个即是begin最后更新于