# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param head ListNode类 
# @param m int整型 
# @param n int整型 
# @return ListNode类
#
"""
 解题思路总结:
 1.定义一个虚拟头结点res 指向head 
 2. 定义left 指针从res 开始 移动到 m 位置前一个位置,移动m-1 次
3. 定义 right 从left 位置继续移动n-m+1 次到达【m,n】区间末尾节点
4. tail =right.next 保存尾部
5. 切断链表  : leftNode 保存【m,n】 区间左端点,前一个的next指向None ,即left.next=None
  n位置right 的next 指向空 ,right.next=None  
6. 将切出来的【n,m】区间的头节点 leftNode 传入reverse(leftNode) 反转这段链表

7. 将链表拼接起来 left.next=reverse(leftNode)  原来的lefteNode 反转之之后变成中间部分的尾部指向 tail:
   leftNode.next=tail   
8.返回虚拟节点的next :res.next
"""


class Solution:
    def reverseBetween(self , head: ListNode, m: int, n: int) -> ListNode:
        # write code here
        # 定义一个链表反转
        def reverse( head:ListNode)->ListNode:
            
            if not head or not head.next:  # 一个节点或者空节点
                print(head.val)
                return head 
            cur =head
            pre=None
            while cur:
                next=cur.next 
                cur.next=pre 
                pre=cur
                cur =next
            return pre 
        if not  head or not head.next:
            return head
        if  m>=n:
            return head
        # left 遍历到 m-1 位置
        # 定义虚拟节点
        res=ListNode(-1)
        res.next=head
        left  =res
        k=m 
        while  k-1 >0: #移动到 left 前一个节点
            left=left.next
            k-=1
        right =left # 从left 开始走 n-m+1
        k=n-m+1  # 移动区间右端点
        while k>0:
            
            right=right.next
            k-=1
        #

        # if left==right: # 不需要反转
        #     return head
        # 保存 right 后一个节点 保存尾部
        # 切断
        #print("right",left.val,right.val)
        leftNode=left.next
        left.next=None
        tail=right.next  # 保存尾部
        right.next=None
        # 反转中间
        #print('mid',mid.val,right_next.val)
        new_mid=reverse(leftNode)
        left.next=new_mid

        
        # new_tail = new_mid
        # while new_tail.next:
        #     new_tail=new_tail.next
        leftNode.next=tail  # 原来的m 变成中间的尾部直接指向尾部
        #print("tail",tail.val)
        # 拼接尾部    
    
        
        return res.next