题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
/*
* function ListNode(x){
* this.val = x;
* this.next = null;
* }
*/
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
function reverseBetween(head, m, n) {
// write code here
// 当你在链表的头部放入一个哨兵,然后连上head节点。之后就把head节点当做普通节点,不用单独考虑了。
let dummy = new ListNode(-1);
dummy.next = head;
// p1,p2,pre用来反转区域链表
let p1,
p2,
pre = null;
let pre1 = dummy;
let pos = dummy;
// pre1指向要反转链表区域的前一个节点,
for (let i = 0; i < m - 1; i++) {
pre1 = pre1.next;
}
// pre指向要反转链表区域的第一个节点
pre = pre1.next;
// pos指向要反转链表区域的后一个节点
for (let j = 0; j < n + 1; j++) {
pos = pos.next;
}
// 反转区域链表
while (pre != pos) {
p1 = pre.next;
pre.next = p2;
p2 = pre;
pre = p1;
}
// x指向设置反转区域的最后一个节点
var x = pre1.next;
// 断开第一部分和反转区域的链接
pre1.next = null;
// 将第一部分和反转区域进行连接 (此时反转区域的头指针为p2)
pre1.next = p2;
// 将反转列表区域和第二部分进行连接
x.next = pre;
// 返回head头节点;
return dummy.next;
}
module.exports = {
reverseBetween: reverseBetween,
};
安克创新 Anker公司福利 716人发布
