# 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:
        if m == n:
            return head
        
        # 定义空头结点,避免特殊判断
        top = ListNode(1001)

        # 定义开始反转之前的位置
        startPre = top
        startPre.next = head
        # 确定开始反转的位置、开始反转之前的位置
        idx1 = m
        while idx1 > 1 :
            startPre = startPre.next
            idx1 -= 1
        start = startPre.next

        # 开始反转
        pre = None
        cur = start
        idx2 = n - m + 1
        while idx2 > 0 :
            nxt = cur.next
            cur.next = pre
            pre = cur
            cur = nxt
            idx2 -= 1
            
        # 确定结束反转的位置、结束反转之后的位置
        end = pre
        endAfter = cur

        # 拼接三段链表(反转前、反转、反转后)
        start.next = endAfter
        startPre.next = end

        # 定义的空头结点的next就是真正的头结点
        return top.next