class Solution:
    def reverseKGroup(self , head: ListNode, k: int) -> ListNode:
        # 区间反转函数,返回本组头尾和下组第一个元素
        def reverse(pre, cur):
            tail = cur
            for i in range(k):
                nex = cur.next
                cur.next = pre
                pre = cur
                cur = nex
            return pre, tail, cur
        # 求长度,便于后面循环
        cur = head
        length = 0
        while cur != None:
            length += 1
            cur = cur.next
        if length < k:
            return head
        # 得到第一组头,尾和第二组第一个元素
        head, tail, nex = reverse(None, head) 
        # 对剩下的组逐一操作,尾头连接
        for j in range(length//k - 1):
            h, t, nex = reverse(None, nex)
            tail.next = h
            tail = t
        # 落单的元素处理
        tail.next = nex
        return head