/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    public ListNode reverseBetween (ListNode head, int m, int n) {
        // write code here
        ListNode headBefore=new ListNode(0);
        headBefore.next=head;
        ListNode tempNode=head;
        ListNode rightStart;
        ListNode leftEnd,leftEndNext;
        
        //如果只有一个字母,返回该字母
        if(head.next==null){
            return head;
        }
        
        //确定leftEndNext
        if(m==1){
           leftEnd=headBefore;
        }else{
             for(int i=0;i<m-2;i++){
                tempNode=tempNode.next;
                }
            leftEnd=tempNode;
            tempNode=tempNode.next;
        }
        
        leftEndNext=leftEnd.next;
        //确定rightStatrt
        //此时tempNode指向需要反转链表的第一个Node
        int num=n-m+1;
        for(int i=0;i<num;i++){
            tempNode=tempNode.next;
        }
        rightStart=tempNode;
        leftEndNext=reverse(leftEndNext,num);
        tempNode=leftEndNext;
        leftEnd.next=leftEndNext;
        while(tempNode.next!=null){
            tempNode=tempNode.next;
        }
        tempNode.next=rightStart;
        return headBefore.next;
        
    }
    //反转
            public ListNode reverse(ListNode head,Integer num){
            ListNode tempNode=head;
            ListNode newHead=null;
            for(int i=0;i<num;i++){
                tempNode=head;
                head=head.next;
                tempNode.next=newHead;
                newHead=tempNode;
            }
            return tempNode;
        }

}