# 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 , m , n ):
        # write code here
        if not head or n<m :
            return head
        new_head = ListNode(-1)
        new_head.next = head
        pre_node = new_head
        for i in range(1,m):
            pre_node = pre_node.next
        a = pre_node.next
        b = pre_node.next
        for j in range(m,n):
            b = b.next
        next_node = b.next
        a,b = self.reverse(a,b)
        pre_node.next = a
        b.next = next_node
        return new_head.next
    
    def reverse(self,a,b):
        new_head = ListNode(-1)
        new_head.next = a
        b.next = None
        temp = a
        while temp:
            new_temp = temp.next
            temp.next = new_head.next
            new_head.next = temp
            temp = new_temp
        return b,a