# 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 , k ):
        # write code here
        if head is None:
            return head
        if head.next is None:
            return head
        l = self.length(head) #链表的长度
        if k >l :
            return head 
        nums = l // k 
        cur = head #复制一个链表头
        new_head = ListNode(-1) #第一个切片的头,也就是新链表的头
        start = ListNode(-1) #每个切片的头
        end = ListNode(-1) #每个切片的尾

        start = head
        for j in range(k-1):
            cur = cur.next
        end = cur
        cur = cur.next
        end.next = None #截断链表
        start,end = self.reverse(start) #反转切片中链表
        new_head = start

        slice_end = end
        for i in range(nums -1 ):
            #截取一个长度为k的切片
            start = cur
            for j in range(k-1):
                cur = cur.next
            end = cur 

            # 进入该切片的下一个节点
            cur = cur.next

            end.next = None #截断链表

            start,end = self.reverse(start) #反转切片中链表

            slice_end.next = start

            slice_end = end
        slice_end.next = cur 
        return new_head
    def reverse(self,pHead):
        '''反转链表'''
        pre = ListNode(None) # 存储新链表的头
        cur = pHead 
        nex = ListNode(None) # 与cur一起遍历整个链表
        end = ListNode(None)
        while cur is not None:
            nex = cur.next
            if cur == pHead:#判断是否是头
                cur.next = None # 生成新链表的尾
                end = cur
            else:
                cur.next = pre # 反转节点的方向,指向新链表
            pre = cur #将新链表的头指向新节点
            cur = nex #将cur指向下个节点
            # 当遍历到最后一个节点时,nex会变成None,从而cur会变成None,退出循环
        return pre,end
    def length(self,head):
        l = 1 
        while head.next:
            head = head.next
            l+=1
        return l