题解 | #链表内指定区间反转#
链表内指定区间反转
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) { const virtualHead = new ListNode(0); virtualHead.next = head; let pre = virtualHead, cur = null; // pre 前面不动的结点区域 // 题目的结点顺序下标是从1开始的,这里需要移动到不动结点的最后一个位置,也就是m的前一个位置 for (let i = 1; i < m; i++) { pre = pre.next; } // 开始需要反转的结点 cur = pre.next; // 需要反转的循环次数 for(let i = 0; i < n - m; i++) { // 利用一个临时变量完成两个结点的反转 const temp = cur.next; // 当前结点指向下下个结点(跳过临时结点) cur.next = cur.next.next; // temp的下一个结点是前面不动结点的下一个结点(注意这里并不是cur) temp.next = pre.next; // 前面不动的区域的下一个结点是当前这个临时结点 pre.next = temp; // 经过上面的交换就完成了结点顺连,并且cur还完成了下移 } return virtualHead.next; } module.exports = { reverseBetween: reverseBetween, };
下面给出图解: