92. 反转链表 II
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
解:
- 双指针cur1,cur2,分别移动到left对应的节点和right对应的节点。
- 两个变量leftPre,rightNext,分别指向left的前一个节点和right的后一个节点。用来将需要反转的链表部分脱离原链表。
- 脱离完毕后,反转left到right部分的链表
- 再将leftPre,rightNext重新连接到反转后的链表上
- 返回链表头部
var reverseBetween = function(head, left, right) {
const ol = left
const reverse = (node) => {
let cur = node
let pre = null
while (cur) {
const temp = cur.next
cur.next = pre
pre = cur
cur = temp
}
return { rhead: pre, rtail: node }
}
let cur1 = head
let cur2 = head
let leftPre = null
let rightNext = head.next
while (--left) {
leftPre = cur1
cur1 = cur1.next
}
while (--right) {
cur2 = cur2.next
rightNext = cur2.next
}
// 当left是第一个节点的时候就没有上一个节点
if (leftPre) leftPre.next = null
cur2.next = null
const { rhead , rtail } = reverse(cur1)
if (leftPre) leftPre.next = rhead
rtail.next = rightNext
// 当left是1的时候返回反转链表的头节点,否则返回原链表的头节点
return ol === 1 ? rhead : head
};