举一反三,比翻转链表多的操作只是:接上前驱和后置节点

//区间反转
public static ListNode reverseBetween (ListNode head, int m, int n) {
        //临界值
        if(head==null) return null;
        
        ListNode dum = new ListNode(0);
        dum.next = head;
        ListNode prev = dum;//定义虚拟节点dum,方便定义前驱节点prev
        
        ListNode start = head;//M指针
        ListNode end = head;//N指针
        for(int i=1;i<m;i++){//移动M和前驱指针
            if(start!=null) {
                start = start.next;
                prev = prev.next;
            }else return head;//没有达到有效区间则结束程序
        }
        for(int i = 1;i<n;i++){//移动N指针
            if(end!=null) end = end.next;
            else return head;//没有达到有效区间则结束程序
        }
        //如果区间为当前节点,则不用反转
        if(end!=head) prev.next = func(start,end);//执行反转,并接上前驱节点
        
        return dum.next;//返回头节点

    }
    
    //区间反转(同反转链表操作)
    public static ListNode func(ListNode start, ListNode end){
        ListNode dum = end.next;//指向N节点
        ListNode cur = start;
        while(dum!=end){
            ListNode next = cur.next;
            cur.next = dum;
            dum = cur;
            cur = next;
        }
        return end;
    }