leetcode 92 反转链表Ⅱ JavaScript

leetcode 92 反转链表Ⅱ JavaScript
在这里插入图片描述
思路:和206反转链表一样的思路,只是需要多记录一下反转前的上一个节点lPre也就是1
反转时cur表示当前遍历的节点,pre表示cur的上一个节点
反转完成时,pre指向反转链的最后一个也就是4,cur指向反传链下一个也就是5
此时我们要做的是 2连接5,1连接4 完成
在实现过程中,可能会遇见边界问题,也就是left=1时的情况
同样举个例子,1-2-3-4-5反转1-4
此时反转链 没有 上一个节点 咋办 只能把lPre也放在1这个位置
那么反转的时候只需要返回4的头即可,也就是pre
同时start的下一个节点为5 完成
如果没看懂,可以看一下下面代码,都有注释,比较清楚
反转完成后如图所示:
在这里插入图片描述
此时通过start.next = cur lPre.next=pre拼接即可
考虑边界时(left=1),则start在1的位置,只需要start.next = cur即可
记录第一次 不通过看懂别人的代码写出来的力扣 向反算法道路迈出一步

/**
 * @param {ListNode} head
 * @param {number} left
 * @param {number} right
 * @return {ListNode}
 */
var reverseBetween = function(head, left, right) {
    if(left==right||!head.next) return head
    let lPre = head
    // start表示反转链头部
    let start
    // cur表示当前遍历的节点
    let cur
    // pre表示当前遍历节点的上一个节点
    let pre = null
    // lPre指向反转链的前一个节点
    for(let i = 1;i<left-1;i++) {
        lPre = lPre.next
    }
    // left==1是对边界处理
    start = left == 1 ? lPre: lPre.next
    cur = left == 1 ? lPre: lPre.next
    // 链表反转
    for(let i = 0;i<=right-left;i++) {
        let temp = cur.next;
        cur.next = pre;
        pre = cur;
        cur = temp;
    }
    // 反转完成后 pre指向4,cur指向5 start指向2 lPre指向1 所以第一件事是让2.next=5
    start.next = cur
    // 边界处理,如果1 2 3 4 5 要求反转的是1-4 则头为4 返回pre 否则正常返回head 返回head时还需要多做一步接入cur的上一个节点
    if(left !==1){
        lPre.next = pre
        return head
    }
    return pre
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值