# 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 or m == n:
        #如果链表为空(head is None),直接返回;
        #如果 m == n,说明不需要反转(只涉及一个节点),也直接返回原链表。
            return head

        dummy = ListNode(0)     #创建一个虚拟头结点
        dummy.next = head       #指向原链表头结点

        prev = dummy            
        #这样即使 m == 1(也就是需要从头节点开始反转),
        #我们也能统一用 prev.next 来操作,不需要单独处理头节点变化的特殊情况;

        # 1. 找到第 m-1 个节点
        for _ in range(m - 1):
            prev = prev.next

        # 2. 开始反转 m 到 n 的区间
        cur = prev.next          # 第 m 个节点
        reverse_tail = cur       # 反转后的尾节点(原头节点)
        prev_rev = None          # 反转后的头结点
        for _ in range(n - m + 1):  #反转
            nxt = cur.next       #保留原链表当前节点的下一个节点
            cur.next = prev_rev  #在新链表前插入节点(先插位置)
            prev_rev = cur       #新头节点赋值(再插值)
            cur = nxt            #恢复到原链表的下一个节点

        # 3. 重新连接
        prev.next = prev_rev     # prev_rev 是反转后的新头
        reverse_tail.next = cur  # cur 是 n+1 个节点

        return dummy.next