Question

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

Example:

Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5

Note:

  • Only constant extra memory is allowed.
  • You may not alter the values in the list’s nodes, only nodes itself may be changed.

Solution

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseKGroup(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        if head is None:
            return head

        res = None
        prev = None
        p = head

        while True:
            one_node = p
            i = 1
            k_node = p
            while i < k and k_node is not None:
                k_node = k_node.next
                i += 1
            if k_node is None:
                break
            kone_node = k_node.next
            curr_node, next_node = one_node, one_node.next
            for i in range(1, k):
                node = next_node.next
                next_node.next = curr_node
                curr_node, next_node = next_node, node
            one_node.next = kone_node
            if prev is not None:
                prev.next = k_node
            if res is None:
                res = k_node
            prev = one_node
            p = kone_node

        return res if res is not None else head