参考大佬的进行了代码优化,两种实现

import java.util.*;

/*
 * 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) {
        if(head==null||head.next==null){
            return head;
        }
        if((n-m)<1){
            return head;
        }
        ListNode tmpHead=new ListNode(0);
        tmpHead.next=head;
        ListNode start=head;
        ListNode pStart=tmpHead;
        for(int i=1;i<m;i++){
            start=start.next;
            pStart=pStart.next;
        }
        for(int i=0;i<n-m;i++){
            //记录要翻转的节点
            ListNode next=start.next;
            //删除要翻转的节点
            start.next=start.next.next;
            next.next=pStart.next;
            //将要翻转的节点放入 pStart 下一个节点,这个过程类似于入栈,所以可以翻转 pStart 始终不变
            pStart.next=next;

        }

        return tmpHead.next;
    }

    public ListNode reverseBetweenOld (ListNode head, int m, int n) {
        // write code here
        if(head==null||head.next==null){
            return head;
        }
        if((n-m)<1){
            return head;
        }
        int i=1;
        ListNode tmpHead=new ListNode(0);
        tmpHead.next=head;
        head=tmpHead;
        tmpHead=head.next;
        ListNode tmpHeadPre=head;
        //初始化待翻转子列表头及头前驱节点
        while(i<m&&tmpHead!=null){
            tmpHeadPre=tmpHeadPre.next;
            tmpHead=tmpHead.next;
            i++;
        }
        //开始翻转 记录当前翻转前一个节点以便翻转后拼接
        ListNode fHeadPre=tmpHeadPre;
        //翻转链表尾节点
        ListNode fTail=tmpHead;
        //前驱节点
        ListNode pre=null;

        while(i<n&&tmpHead!=null){
            ListNode next=tmpHead.next;
            tmpHead.next=pre;
            pre=tmpHead;
            tmpHead=next;
            i++;
        }
        //循环后还差一次翻转
        ListNode next=null;
        if(tmpHead!=null){
             next=tmpHead.next;
             tmpHead.next=pre;
             pre=tmpHead;
             tmpHead=next;
        }

        //链接无需翻转后续的链表
        fTail.next=next;
        //拼接翻转链表
        fHeadPre.next=pre;
        return head.next;

    }
}