K 个一组翻转链表
-
新建一个
head前面的hair节点var reverseKGroup = function (head, k) { const hair = new ListNode(-1, head); };- 从
head开始k个翻转, 注意此时会先遍历从开始是否有k个节点
var reverseKGroup = function (head, k) { const hair = new ListNode(-1, head); let cur = hair; cur.next = reverse(cur.next, k); }; function reverse(head, k) { let count = k; let cur = head; while (--count && cur) { cur = cur.next; } // 表示从 head 开始没有 k 个节点 if (!cur) return head; // 至少有k个节点 cur = head; let prev = null; while (k--) { const next = head.next; cur.next = prev; prev = cur; cur = next; } head.next = cur; return prev; }- 上述是开始翻转了
head的k个节点,那么需要继续找到head之后的第k个节点继续翻转
var reverseKGroup = function (head, k) { const hair = new ListNode(-1, head); let cur = hair; // 为的是一直遍历 do { cur.next = reverse(cur.next, k); for (let i = 0; i < k && cur; i++) { cur = cur.next; } if (!cur) return hair.next; } while (true); }; function reverse(head, k) { let count = k; let cur = head; while (--count && cur) { cur = cur.next; } // 表示从 head 开始没有 k 个节点 if (!cur) return head; // 至少有k个节点 cur = head; let prev = null; while (k--) { const next = head.next; cur.next = prev; prev = cur; cur = next; } head.next = cur; return prev; } - 从