题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
/*class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
export function reverseBetween(head: ListNode, m: number, n: number): ListNode {
// write code here
if (m >= n) return head;
// 确保肯定m < n
// 前中后三个指针连贯移动来反转 m~n 位置之间的链表指向
let front = null; // 前指针
/**
* 用mid指针指向当前要调整其next的节点
*/
let mid: ListNode | null = head; // 中间指针
let back = null; // 后指针
/**
* 用mp指针定位m位置的节点
*/
let mp = null; // m位置的节点
let count = 1; // 移动计数
while (mid) {
back = mid.next;
if (count >= m) {
// 找到了要反转的起始节点
mid.next = front;
if (count === m) {
// 若此时就在m位置,则用mp指针标记住
mp = mid;
}
}
if (count === n) {
// 此时mid指向n位置节点,结束遍历,此时mid指向要反转的最后一个节点
break;
}
front = mid;
mid = back;
count++;
}
front = (mp as ListNode).next;
if (front) {
// front不为null说明m不为1
front.next = mid;
(mp as ListNode).next = back;
return head;
}
// front为null说明m===1
(mp as ListNode).next = back;
return mid as ListNode;
}
