题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
#test02 链表内指定区间反转
重点:头插法(保证链表第一个节点不乱跑,稳定整条链)、找到m位置、区间内反转,注意返回值
还是太菜,但是算法题很上头
/*
* 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
//m等于n 不需要翻转
if (m === n) {
return head;
}
//链表为空或链表长度为1不需要翻转
if (head == null || head.next == null) {
return head;
}
//定义一个新表头指向head 头插法!
let newHead = new ListNode(-1);
newHead.next = head;
//先遍历找到m的位置,
let pre = newHead;
for (let i = 1; i < m; i++) {
pre = pre.next;
}
//找到m的位置:pre(翻转链表,这里pre相当于 m-n链 表头位置),从m开始翻转到n
let p1 = pre.next, p2;
for (let i = m; i < n; i++) {
p2 = p1.next;
p1.next = p2.next;
p2.next = pre.next;
pre.next = p2;
}
//翻转完毕,返回的newHead.next(因为newHead是相对前移一位的)
return newHead.next;
}
module.exports = {
reverseBetween: reverseBetween,
};
