# 25. K 个一组翻转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

# 解题思路

遍历链表,并记录当前节点的序号,如果当前节点的序号是 k 的整数倍,那么就翻转从上一组尾部到当前节点的链表。

为此每一次反转我们都需要更新上一组的尾部和下一组的开头节点。

最后,如果剩余的节点个数不是 k 的整数倍,那么需要将剩余部分直接添加到上一组的尾部。

/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var reverseKGroup = function (head, k) {
  function reverseList(head) {
    var cur = head,
      temp = null,
      prev = null
    while (cur) {
      temp = cur.next
      cur.next = prev
      prev = cur
      cur = temp
    }
    return prev
  }

  if (k === 1 || !head.next) {
    return head
  }

  var n = 0 // 节点数
  var n_head = new ListNode()
  var prev = n_head // 上一部分的终点
  var cur_start = head // 当前部分的起点
  var cur = head
  var next = null // 接下来一部分的起点

  while (cur) {
    n++

    // k 的整数倍
    if (!(n % k)) {
      // 反转当前部分的起点到当前点,并将当前点的下一个点更新到接下来一部分的起点
      next = cur.next
      cur.next = null
      prev.next = reverseList(cur_start)
      prev = cur_start
      cur = next
      cur_start = cur
    } else {
      cur = cur.next
    }
  }

  if (n % k) {
    prev.next = cur_start
  }

  return n_head.next
}

# 参考