题目
解题
// javascript
var reverseKGroup = function(head, k) {
const newHead = new ListNode(0); // 伪头节点
let tail = newHead; // 记录已完成翻转部分的尾节点
while (hasMoreThanKNode(head, k)) { // 判断剩余部分的节点数量是否 >= k
const nextTail = head; // 当前 head 是下一次的 tail
head = reverseList(head, k, tail); // 翻转 k 个节点,并取得下一截的头节点
tail = nextTail; // 更新尾节点
}
// 如果还有剩余部分(长度不足 k),接在 tail 后
// 因为使用了哑节点,可以省去 tail 为 null 的判断
tail.next = head;
return newHead.next;
};
const hasMoreThanKNode = (head, cnt) => {
while (head !== null && cnt > 0) {
cnt--;
head = head.next;
}
return cnt === 0;
};
const reverseList = (head, cnt, front) => {
let prev = null, next = null;
while (head !== null && cnt > 0) {
cnt--;
next = head.next;
head.next = prev;
prev = head;
head = next;
}
front.next = prev; // 将当前处理完成的 k 个节点接在已处理好的部分后面
return next; // 返回下一截的头节点
};