题目地址
题解
思路1:辅助函数 + 递归
- 重点在于搞清楚end,start的作用,一定要熟练反转链表的操作,具体思路见注释
- 分析得时间复杂度O(n) 空间复杂度 O(1)
- 代码实现
const reverseKGroup = (head, k) => {
// 终止条件,看后面的是否小于k
let [end, start] = [head, head]
// 判断长度是否大于k,end负责记录下次需要继续的位置
for (let i = 0; i < k; i++) {
end = end.next
if (!end) return head
}
// 因为反转链表所以start变成了新链表的尾结点,end为老链表需要继续遍历的节点
let newHead = reserve(start, end)
start.next = reverseKGroup(end, k)
return newHead
// 反转链表
};
const reserve = (start, end) => {
let [pre, current] = [null, start]
while (current !== end) [current.next, pre, current] = [pre, current, current.next]
return pre
}