var reverseKGroup = function (head, k) {
let dummy = new ListNode(0, head);
// 前一组的尾节点
let prevGroupTail = dummy;
while (true) {
// 找到当前组的尾节点
let currentGroupTail = prevGroupTail;
for (let i = 0; i < k; i++) {
currentGroupTail = currentGroupTail.next;
// 如果剩余节点不足 k 个,则不需要反转,直接返回链表头部
if (!currentGroupTail) return dummy.next;
}
// 记录当前组的头节点以及下一组的头节点
let currentGroupHead = prevGroupTail.next;
let nextGroupHead = currentGroupTail.next;
// 反转当前组,定义两个指向当前组头和尾的指针,prev、cur
let prev = nextGroupHead;
let cur = currentGroupHead;
for (let j = 0; j < k; j++) {
const temp = cur.next;
cur.next = prev;
prev = cur;
cur = temp;
}
// 接回上一组,因为已反转,所以是 currentGroupTail 连接到 prevGroupTail 的 next
prevGroupTail.next = currentGroupTail;
// 移动用来指向上一组尾节点的指针,指向当前组的尾节点(因为已反转,所以是 currentGroupHead)
prevGroupTail = currentGroupHead;
}
};