BM3 链表中的节点每k个一组翻转

alt

/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */

/**
 *
 * @param head ListNode类
 * @param k int整型
 * @return ListNode类
 */
function reverseKGroup(head, k) {
  // write code here
  if (!head || k === 1) return head;
  let newHead = new ListNode(0);
  newHead.next = head;
  head = newHead;
  let prev = head;
  let curr = prev.next;
  let next = null;
  let isNext = curr;
  while (curr) {
    //     判断当前节点后面是否还有足够的节点(少于k个, 直接返回整个链表)
    for (let i = 1; i < k; i++) {
      if (isNext.next === null) return head.next;
      isNext = isNext.next;
    }
    //    head(0) -> 1 -> 2 -> 3 -> 4 -> 5
    //            pn   cn   nn
    //    head(0) -> 2 -> 1 -> 3 -> 4 -> 5
    //            pn   nn c cn   cnn        (之后的循环每次初始设 next = cn)
    for (let i = 1; i < k; i++) {
      next = curr.next;
      curr.next = next.next;
      next.next = prev.next;
      prev.next = next;
    }
    //     prev 节点的下一个节点设为第 k 个节点, 也就是将 prev 设为之前的 curr
    //     curr = prev.next 节点设为第 k 个节点, 也就是 prev.next
    prev = curr;
    curr = prev.next;
    isNext = curr;
  }

  return head.next;
}

module.exports = {
  reverseKGroup: reverseKGroup,
};

如有问题望指正