import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    public ListNode reverseBetween (ListNode head, int m, int n) {
      /**
       * 遍历区间内的节点,每次放在pre的后面
       *
       */
        ListNode headPre = new ListNode(-1);
        headPre.next = head;
        //把链表分为  头部   尾部  待翻转的部分
        ListNode first=headPre;
        ListNode reverse;
        ListNode reverse2=null;
        ListNode last;

        for(int i =0; i<m-1;i++){
            first=first.next;
        }

        

        // 这个时候头已经选出来了 
        reverse=first.next;
        reverse2=reverse;

        if(m!=1){
            first.next=null;
            first=headPre.next;
        }
     
  
        for(int i =0; i<n-m;i++){
            reverse2=reverse2.next;
        }

        last=reverse2.next;
        reverse2.next=null;
        reverse2=reverse;


        ListNode newHead=reverseList(reverse);
        if(m!=1){
            ListNode temp=first;
            while(temp.next!=null){
                temp=temp.next;
            }
            temp.next=newHead;
        }else{
            first=newHead;
        }
     

        while(newHead.next!=null){
            newHead=newHead.next;
        }
        newHead.next=last;
        return first;
    }

     public ListNode reverseList (ListNode head) {
        ListNode pre=null;
        while(head!=null){
            ListNode next=head.next;
            head.next=pre;
            pre=head;
            head=next;
        }
        return pre;
     }

      
}