Reverse Nodes in k-Group

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

Example:

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5

Note:

Only constant extra memory is allowed. You may not alter the values in the list's nodes, only nodes itself may be changed.

Analyze

① 将 tail 移到要翻转部分的最后一个元素, 若移动 k 元素之前已到达链表末尾则完成每间隔 k 个值的链表翻转;

② 接着依次把 cur 移到 tail 后面;

``````k === 3

prev
dummy    1     2     3     4     5

dummy    1     2     3     4     5
cur

dummy    2     3    1     4     5
cur

dummy    3     2    1     4     5
cur``````
``````/**
* function ListNode(val) {
*     this.val = val;
*     this.next = null;
* }
*/
/**
* @param {number} k
* @return {ListNode}
*/
var reverseKGroup = function(head, k) {

while (true) {
let count = 0
while (tail.next && count !== k) {
tail = tail.next
count++
}
if (count !== k) break

while (prev.next !== tail) {
let cur = prev.next
prev.next = cur.next
cur.next = tail.next
tail.next = cur
}