跳过正文
  1. leetcode 题解/

25_K_个一组翻转链表

·210 字·1 分钟

类型:链表

    1. K 个一组翻转链表 ❤️

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

    ❓ 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

    输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5]

    💡 本题不涉及复杂的算法,只是需求实现的细节比较多。

    💡 迭代

    class Solution:
        def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
            if not head or not head.next or k == 1:
                return head
            dummyHead = ListNode()
            dummyHead.next = head
            start = dummyHead
            end = dummyHead
            while end:
                for _ in range(k):
                    if end:
                        end = end.next
                if end:
                    endNext = end.next
                    pre = start.next
                    cursor = start.next.next
                    while True:
                        nextCursor = cursor.next
                        cursor.next = pre
                        pre = cursor
                        if cursor == end:
                            break
                        else:
                            cursor = nextCursor
                    nextStart = start.next
                    start.next.next = endNext
                    start.next = end
                    start = end = nextStart
            return dummyHead.next

    💡 递归

    class Solution:
        def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
            if not head or not head.next or k == 1:
                return head
    
            def reverse(head, tail, terminal):
                pre = None
                cur = head
                while cur != terminal:
                    theNext = cur.next
                    cur.next = pre
                    pre = cur
                    cur = theNext
                return tail, head
    
            dummyHead = ListNode()
            dummyHead.next = head
            pre = dummyHead
            tail = dummyHead
            while tail:
                for _ in range(k):
                    if tail:
                        tail = tail.next
                if tail:
                    terminal = tail.next
                    head, tail = reverse(pre.next, tail, terminal)
                    pre.next = head
                    tail.next = terminal
                    pre = tail
            return dummyHead.next