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
};