# 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
        dummynode = ListNode(-1)
        dummynode.next = head
        pre = dummynode
        for _ in range(m - 1):  #先找到反转链表的前一个节点
            pre = pre.next
        cur = pre.next  #找到反转链表的第一个节点
        for _ in range(n - m):  # 要明确一点,cur节点永远指向原反转链表部分的头;比如 cur一直指向2,直到反转完成
            tmp = cur.next  
            cur.next = tmp.next
            tmp.next = pre.next  # 反转链表的第一个和最后一个互换位置
            pre.next = tmp  # 原链表节点指向每一轮反转链表的最后一个节点
        return dummynode.next