From a3c4f1b9fcf28dc7d4de983c851d40c773109b25 Mon Sep 17 00:00:00 2001 From: yige Date: Sat, 16 May 2020 20:46:41 +0800 Subject: [PATCH] =?UTF-8?q?update:=20K=E4=B8=AA=E4=B8=80=E7=BB=84=E7=BF=BB?= =?UTF-8?q?=E8=BD=AC=E9=93=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/list/reverse-nodes-in-k-group.js | 30 +++++++++++++--------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/list/reverse-nodes-in-k-group.js b/src/list/reverse-nodes-in-k-group.js index e1c70fb..752d97f 100644 --- a/src/list/reverse-nodes-in-k-group.js +++ b/src/list/reverse-nodes-in-k-group.js @@ -11,33 +11,31 @@ * @return {ListNode} */ export const reverseKGroup = function (head, k) { - let sum = 0 - let start = head - let newStart = head - let first = true - const last = [] - while (head) { - if (++sum === k) { + let sum = 0 // 记录进行的结点个数 + let start = head // 记录每次翻转的第一个元素 + let res = head // 返回值:如果进行过翻转,则为第一次翻转的最后一个结点 + const queue = [] // 使用队列,方便连接上一次翻转的链表,最大长度为2 + while (head) { // 遍历一次链表 + if (++sum === k) { // 如果经过了k个结点,则翻转从start到head的一段结点 const headNext = head.next - last.push(start) + queue.push(start) // 计入队列 let next = head.next - for (let i = 0; i < sum - 1; i++) { + for (let i = 0; i < sum - 1; i++) { // 翻转结点 const tmp = start.next start.next = next next = start start = tmp } - start.next = next + start.next = next // 最后一个结点 - if (first) { - newStart = start - first = false + if (queue.length === 1) { // 判断是否为第一次翻转 + res = start } else { - const la = last.shift() + const la = queue.shift() // 连接上一次翻转的链表 la.next = head } - sum = 0 + sum = 0 // 重置计数 start = headNext head = headNext } else { @@ -45,5 +43,5 @@ export const reverseKGroup = function (head, k) { } } - return newStart + return res }