LeetCode 25 难度:hard
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/
参考:公众号:labuladong
框架(参考)
- base case
- 调用函数完成工作
- 完成函数没有完成的工作
- 返回值
步骤
① 寻找递归性质
可以看到,我们只需要K个K个为一组,反转,并且连接起来即可。
关键字:子问题
三个关键点:
- newHead 是需要返回的
- 图中节点1 的next是要指向 第 k + 1 个节点的
- head 是下一次递归的头结点
② 书写迭代反转链表代码
基础思想,设置:
- 前节点指针
- 当前节点指针
- 后节点指针
并且挨个反转,然后向后移动
var reverseList = function(head) {
let previous = null
let current = head
let next = head
while(current){
next = current.next
current.next = previous
previous = current
current = next
}
return previous
};
那如何反转部分呢?添加一个参数即可。
function reverseListPart(head, end){
let previous = null
let current = head
let next = head
// 这里反转的区间是 [head, end) end 不被反转
while(current !== end){
next = current.next
current.next = previous
previous = current
current = next
}
return previous
}
这里特别注意,反转的区间是[head, end)
③根据上述定义,书写正式代码
var reverseKGroup = function(head, k) {
if(head == null){
return head
}
let begin = head
let end = head
for(let i = 0; i < k; ++i){
// 不足k个,直接返回(base case)
if(end == null){
return head
}
end = end.next
}
// 反转前K个元素
const newHead = reverseListPart(begin, end)
// 将反转后的元素接起来
begin.next = reverseKGroup(end, k)
// 返回反转后的头结点
return newHead
};