# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param head ListNode类 
# @param m int整型 
# @param n int整型 
# @return ListNode类
#
class Solution:
    def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
        # write code here
        if not head:
            return None
        cur = head #用于找第m个对象,默认为头指针
        pre = None #初始时,pre为空,找到第m个对象后,再赋值
        last = head #用于找第n个对象,默认为头指针
        lastnext = None#初始时,n的下一个对象为空,下面找到last后,再赋值
        if m > 1:#当m=1时,cur=head,pre=None。大于1时才需要往后查找。
            i = 1
            while i < m-1: #m-2次移动找到pre前置的指针位置
                cur = cur.next
                i += 1
            pre = cur #移动后的指针赋值给pre
            cur = cur.next#移动后当前指针的next对象赋值给cur
        i = 1
        while i < n:#n-1次指针移动快速移动到n对应的对象。
            last = last.next
            i += 1
        lastnext = last.next #找到n号对象的下一个对象指针
        k = lastnext #把m-n的链表对象单独拿出来,cur指针是该小链表的头指针,lastnext是链表最后一个对象指向的位置。
        while cur != lastnext:#把小链表拆开,把第一个对象拿出来,下一跳指向lastnext,重复把第二个拿出来,下一跳指向第一个对象。
            temp = cur.next #缓存当前的下一个指针
            cur.next = k #把当前的下一个指向lastnext
            k = cur  #移动参照指针k
            cur = temp #移动当前指针到下一个。
        if pre: #如果pre不为空,即m不等于1,需要把小链表的头指针赋值给pre下一跳
            pre.next = k  #链表拼接,把当前小链表的头指针赋值给pre下一跳。
            return head
        else:#如果m=1,即pre为空,小链表的头指针即大链表的头指针。
            return k