题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
思路: 把k个节点传入反转函数; 注意点: 1、反转之后节点之间的关系要处理好; 2、把反转区间的头节点,结束节点传入反转的函数在一定程度上方便处理 3、为了方便处理关系,需要记录开始反转的上一个节点以及反转结束的下一个节点 /* * function ListNode(x){ * this.val = x; * this.next = null; * } */ /** * * @param head ListNode类 * @param k int整型 * @return ListNode类 */ function reverseKGroup(head, k) { // write code here let dummyHead = new ListNode(""); dummyHead.next = head; let prev = dummyHead; while (head) { let tail = prev; for (let i = 0; i < k; i++) { tail = tail.next; if (!tail) { // 不满足直接返回即可 return dummyHead.next; } } // 记录反转的结束点的下一个节点 let next = tail.next; // 反转的开始节点、结束节点 [head, tail] = myReverse(head, tail); // 重新构建指针 prev.next = head; tail.next = next; // 移动指针 prev = tail; head = prev.next; } return dummyHead.next; } function myReverse(head, tail) { let prev = tail.next; let cur = head; // 结束条件 while (prev !== tail) { const nextNode = cur.next; cur.next = prev; prev = cur; cur = nextNode; } return [tail, head]; } module.exports = { reverseKGroup: reverseKGroup, };