《算法通关村第二关-单链表之指定区间反转问题》

LeetCode92 :给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right。请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表。

方法一: 使用虚拟节点

定义一个虚拟节点res,初始值为-1,指向head头节点。方便处理头节点,和链表为空的情况。

 public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode res=new ListNode(-1,head);
ListNode pre=res;

//遍历pre找到指定区间的前一个节点
for(int i=0;i<left-1;i++){
    pre=pre.next;
}
ListNode cur=pre.next;
ListNode next=null;

for(int i=0;i<right-left;i++){
next=cur.next;
cur.next=next.next; //1.
next.next=pre.next; //2.
pre.next=next; //3.
}


return res.next;
    }

关键代码执行流程如下:注意第1,2,3步的前后顺序不能颠覆。

方法二:拆分链表 

在前一种方法的基础上进行改变,我们 获取指定链表区间的头节点定义为leftNode,以及最后一个节点rightNode。将链表进行拆分,指定的链表区间全部反转完成后,再接回来即可。

    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode res=new ListNode(-1,head);
        ListNode pre=res;

        for(int i=0;i<left-1;i++){//走到left的前一个节点
            pre=pre.next;
        }

        ListNode leftNode=pre.next;//left节点
        ListNode rightNode=pre;

        for(int i=0;i<right-left+1;i++){//走到right节点
rightNode=rightNode.next;
        }

        ListNode succ=rightNode.next;//right的后一个节点
        rightNode.next=null; //切断链表

        reverseList(leftNode);//反转leftNode到rightNode之间全部的节点
        //反转之后rightNode变成新链表的头节点,leftNode变成最后一个节点

        pre.next=rightNode;
        leftNode.next=succ;


    return res.next;

    }

//反转链表
public ListNode reverseList(ListNode head){
    ListNode pre=null;
    ListNode cur=head;

ListNode next=null;
    while(cur!=null){
next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
    }
    return pre;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值