# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param head ListNode类 
# @param k int整型 
# @return ListNode类
#
class Solution:
    def reverseKGroup(self , head: ListNode, k: int) -> ListNode:
        # write code here
        result_list_head_flag = ListNode(-1)
        result_list_head_flag.next = head
        # 第一个节点没有上一个节点,所以初始化为空。
        previous = None
        current = head
        # 现在还没有上一个子列表,用结果列表头的标记指针来占用这个位置,可以让这个头标记可以在处理过程中连接上结果列表的头节点。
        previous_sublist_tail = result_list_head_flag
        # 当前子列表的尾巴就是当前访问到的节点。
        current_sublist_tail = current
        count = 0
        while current:
            print(current.val)
            count += 1
            if count == 1:
                # 如果是新开子列表的第一个节点,复制当前节点。
                copy_current = ListNode(current.val)
                # 把这个节点标记为当前子列表的尾巴。
                current_sublist_tail = copy_current
                # 把这个复制节点标记为上一个节点,并进行下一步访问。
                previous = copy_current
                current = current.next
            elif count == k:
                # 复制当前节点,并与上一个复制节点逆序。
                copy_current = ListNode(current.val)
                copy_current.next = previous
                # 把当前子列表和上一个子列表的尾巴相连。
                previous_sublist_tail.next = copy_current
                # 把当前子列表的尾巴指向原列表中的下一个节点,保证凑不足k个元素的剩余部分能与逆序列表相连。
                current_sublist_tail.next = current.next
                # 当前子列表的为节点将作为下个子列表的前一个子列表的尾节点。
                previous_sublist_tail = current_sublist_tail
                current = current.next
                count = 0
            else:
                # 复制当前节点,并与上一个复制节点逆序。
                copy_current = ListNode(current.val)
                copy_current.next = previous
                # 把这个复制节点标记为上一个节点,并进行下一步访问。
                previous = copy_current
                current = current.next
        
        return result_list_head_flag.next