25. k个一组翻转链表

https://leetcode-cn.com/problems/reverse-nodes-in-k-group/

解法一:

用指针对i,j表示要反转的链表首尾,并记录i的前驱pre,写一个辅助函数将i,j范围内的链反转,并保持该段的前驱和后继关系不变。每次j走k步向前探测,若[i:j]段不为空,则调用函数反转。

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

2020.3.27

class Solution:
    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        Head = ListNode(0)
        Head.next = head
        start_pre, start, end = Head, head, Head
        count = 0
        #end先走k步,看是否到头
        while end and count < k:
            end = end.next
            count += 1
        #每次循环处理[start, end]部分链表
        while end and count % k == 0:
            start.next = end.next        
            tmp = None        
            for _ in range(k-1):
                tmp = work
                work = work.next
                tmp.next = start_pre.next
                start_pre.next = tmp
            end = start
            start_pre = start
            start = work
            count = 0
            while end and count < k:
                end = end.next
                count += 1
        return Head.next

最后更新于