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]))
+})