https://www.youtube.com/watch?v=1UOPsfP85V4

class Solution {
    reverseKGroup(head, k) {
        const dummy = new ListNode(0, head);
        let groupPrev = dummy;
 
        while (true) {
            const kth = this.getKth(groupPrev, k);
            if (!kth) break;
 
            const groupNext = kth.next;
 
            let prev = groupNext;
            let curr = groupPrev.next;
 
            while (curr !== groupNext) {
                [curr.next, prev, curr] = [prev, curr, curr.next];
            }
 
            const tmp = groupPrev.next;
            groupPrev.next = kth;
            groupPrev = tmp;
        }
 
        return dummy.next;
    }
 
    getKth(curr, k) {
        while (curr && k > 0) {
            curr = curr.next;
            k--;
        }
        return curr;
    }
}