class Solution {
public:
  /**
   * 
   * @param head ListNode类 
   * @param k int整型 
   * @return ListNode类
   */
  ListNode* reverseKGroup(ListNode* head, int k) {
    // corner case
    if (!head || !head->next || k <= 1)
      return head;

    stack<ListNode*> stk;
    ListNode dummy(0), *p = &dummy, *curr = head;
    for (int cnt = length(head) / k; cnt--; ) {
      for (int i = 0; i < k; i = -~i) {
        stk.emplace(curr);
        curr = (*curr).next;
      }
      while (not stk.empty()) {
        p = p->next = stk.top();
        stk.pop();
      }
    }

    p->next = curr;
    return dummy.next;
  }

private:
  size_t length(ListNode* head) {
    return head ? 1 + length(head->next) : 0;
  }
};