# 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:
        #设置哨兵节点,对于链表相关的问题,我们通过设置哨兵节点可以省去边界条件的判断
        dummynode = ListNode(-1)
        #哨兵节点指向链表头
        dummynode.next = head
        pre = dummynode
        #遍历,使得pre指向链表反转部分的第一个结点 m 代表的位置前一个节点
        for _ in range(m - 1):
            pre = pre.next
        #cur指向链表反转部分的第一个节点 m 代表的位置
        cur = pre.next
        for _ in range(n - m):
            temp = cur.next   # 将 m 下一个节点的地址存到 temp 变量里面
            cur.next = temp.next  # 将 m 存储的下一个节点地址改为 m+2 节点的地址
            temp.next = pre.next  # 将 m + 1 节点 存储的节点地址改为 pre 的下一个节点(每一次循环都是cur 的下一个地址,cur不断移动直到n的位置)
            pre.next = temp    # 将pre 存储的节点地址 改为temp变量的值 即为 m + 1 的地址
        return dummynode.next