题解 | #链表内指定区间反转#
链表内指定区间反转
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; }