思路
记录left和right的值反转中间然后接上去
代码
var reverseBetween = function (head, left, right) {
// 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论
const newHead = new ListNode(-1);
newHead.next = head;
let p1 = newHead;
// p1一直移到left的前一项
for (let i = 0; i < left - 1; i++) {
p1 = p1.next;
}
//保留p1,切断其next后p1就是拼接的左链表的最后一个元素
//p2 移动到left处,切断其next后,p2.next就是拼接的右链表的第一个元素
let p2 = p1;
for (let i = 0; i < right - left + 1; i++) {
p2 = p2.next;
}
//中间需要反转的链表
let p3 = p1.next;
//拼接的右链表的第一个元素
let p4 = p2.next;
//切断连接
p1.next = null;
p2.next = null;
//反转
reverseLinkedList(p3);
// 拼接链表,链表反转后第一个元素为其原来的最后一个元素p2
p1.next = p2;
p3.next = p4;
return newHead.next;
};
const reverseLinkedList = (head) => {
let p1 = head;
let p2 = null;
while (p1) {
const n = p1.next;
p1.next = p2;
p2 = p1
p1 = n;
}
}
复杂度
时间:O(n)
空间: O(n)