【牛客网TOP101】BM2 链表内指定区间反转

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) {
        // write code here
        // 通过构建一个虚拟头结点,消除了对头结点复杂的分类考虑
        int counter=0;
        ListNode virtual=new ListNode(-1);
        virtual.next=head;
        ListNode p=null,pnext=virtual,temp;
        ListNode firstpre=null,first=null,last=null,lastnext=null;
        while(pnext!=null){
            if(counter==m-1){
                firstpre=pnext;
                first=pnext.next;
            }
            if(counter==n){
                last=pnext;
                lastnext=pnext.next;
            }
            if(counter>=m&&counter<=n){
                temp=pnext.next;
                pnext.next=p;
                p=pnext;
                pnext=temp;
                counter++;
                continue;
            }
            counter++;
            temp=pnext.next;
            p=pnext;
            pnext=temp;
        }
        firstpre.next=last;
        first.next=lastnext;
        return virtual.next;//这一步非常精髓,我之前返回了head,但是这样有部分情况不适用
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值