92题、206题都为此类型反转链表题目 这一题要处理下最后不足k个的情况,然后注意这个反转是带有终点的,也就是right节点,注意判断好跳出条件即可
var reverseKGroup = function (head, k) {
if (head === null) return head
let left = head, right = head
for (let i = 0; i < k; ++i) {
// 不足k个,肯定会遇到 right = null
if (!right) return head
right = right.next
}
// 第一次反转后获取到的list,list为头节点
let list = reverse(left, right)
// left 节点变成了右边的节点,然后衔接下一次递归的链表
// right 为下一次链表的起始点
left.next = reverseKGroup(right, k)
return list
};
// 反转left和right之间的链表
var reverse = function (left, right) {
let pre = null, current = left
while (current !== right) {
let nextNode = current.next
current.next = pre
pre = current
current = nextNode
}
return pre
}
不足k个也进行反转
var reverseKGroup = function (head, k) {
if (!head) return head
let left = head, right = head
for (let i = 0; i < k; ++i) {
// 直接在此处break
// 此时right走到最右端
if (!right) break
right = right.next
}
let list = reverseList(left, right)
left.next = reverseKGroup(right, k)
return list
};
var reverseList = function (left, right) {
let pre = null, current = left
while (current !== right) {
let nextNode = current.next
current.next = pre
pre = current
current = nextNode
}
return pre
}