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