# 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:

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:
"""
:type k: int
:rtype: ListNode
"""

res = None
prev = None

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