From 55ff39a1c3409d27f159501a6d7f9584a9728da2 Mon Sep 17 00:00:00 2001 From: yige Date: Sat, 16 May 2020 19:50:31 +0800 Subject: [PATCH] =?UTF-8?q?add:=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 --- README.md | 5 +++ src/list/reverse-nodes-in-k-group.js | 49 ++++++++++++++++++++++ test/list/ListNode.js | 10 +++++ test/list/reverse-nodes-in-k-group.test.js | 11 +++++ 4 files changed, 75 insertions(+) create mode 100644 src/list/reverse-nodes-in-k-group.js create mode 100644 test/list/reverse-nodes-in-k-group.test.js diff --git a/README.md b/README.md index cdd4dd0..7ccb774 100644 --- a/README.md +++ b/README.md @@ -411,3 +411,8 @@ LeetCode 与 LintCode 解题记录。此为个人练习仓库,代码中对重 - LeetCode 876. 链表的中间结点 - LintCode 1609. 链表的中间结点 + +- [K个一组翻转链表](src/list/reverse-nodes-in-k-group.js) + + - LeetCode 25. K 个一组翻转链表 + - LintCode 450. K组翻转链表 diff --git a/src/list/reverse-nodes-in-k-group.js b/src/list/reverse-nodes-in-k-group.js new file mode 100644 index 0000000..e1c70fb --- /dev/null +++ b/src/list/reverse-nodes-in-k-group.js @@ -0,0 +1,49 @@ +/** + * Definition for singly-linked list. + * function ListNode(val) { + * this.val = val; + * this.next = null; + * } + */ +/** + * @param {ListNode} head + * @param {number} k + * @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) { + const headNext = head.next + last.push(start) + let next = head.next + for (let i = 0; i < sum - 1; i++) { + const tmp = start.next + start.next = next + next = start + start = tmp + } + + start.next = next + + if (first) { + newStart = start + first = false + } else { + const la = last.shift() + la.next = head + } + sum = 0 + start = headNext + head = headNext + } else { + head = head.next + } + } + + return newStart +} diff --git a/test/list/ListNode.js b/test/list/ListNode.js index 8b1e111..6318820 100644 --- a/test/list/ListNode.js +++ b/test/list/ListNode.js @@ -15,3 +15,13 @@ export const arrToList = (arr) => { return head } + +export const listToArr = (list) => { + const arr = [] + while (list) { + arr.push(list.val) + list = list.next + } + + return arr +} diff --git a/test/list/reverse-nodes-in-k-group.test.js b/test/list/reverse-nodes-in-k-group.test.js new file mode 100644 index 0000000..706d867 --- /dev/null +++ b/test/list/reverse-nodes-in-k-group.test.js @@ -0,0 +1,11 @@ +import { reverseKGroup } from '../../src/list/reverse-nodes-in-k-group' +import { arrToList, listToArr } from './ListNode' + +test('K个一组翻转链表', () => { + const res = reverseKGroup(arrToList([1, 2, 3, 4, 5]), 3) + expect(listToArr(res)).toEqual([3, 2, 1, 4, 5]) + expect(res).toEqual(arrToList([3, 2, 1, 4, 5])) + expect(reverseKGroup(arrToList([1, 2, 3, 4, 5]), 2)).toEqual(arrToList([2, 1, 4, 3, 5])) + expect(reverseKGroup(arrToList([1, 2, 3, 4, 5, 6]), 2)).toEqual(arrToList([2, 1, 4, 3, 6, 5])) + expect(reverseKGroup(arrToList([1, 2, 3, 4, 5, 6, 7, 8]), 2)).toEqual(arrToList([2, 1, 4, 3, 6, 5, 8, 7])) +})