# 反转链表,每 k 个节点反转一次

// 创建链表
function createLinkList(...args) {
  const res = {};
  let current = res;
  while (args.length) {
    current.value = args.shift();
    current.next = {};
    current = current.next;
  }
  return res;
}

// 反转链表,每 k 个节点反转一次
function reverse(linklist, k) {
  const stack = [];
  let current = linklist;

  // 前面k个入栈
  while (current.next && stack.length + 1 <= k) {
    stack.push(current.value);
    current = current.next;
  }

  // 不足k不用反转
  if (stack.length < k) {
    return linklist;
  }

  // 出栈+拼接current节点再递归
  let temp = {};
  const ret = stack.reduceRight(
    (res, cur) => ((temp.value = cur), (temp = temp.next = {}), res),
    temp
  );
  current && current.next && Object.assign(temp, reverse(current, k));
  return ret;
}

// 按顺序打印链表
function print(link, arr = []) {
  while (link && link.value !== undefined) {
    arr.push(link.value)
    link = link.next
  }
  return arr
}

console.log(print(reverse(createLinkList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), 3)));
// [ 3, 2, 1, 6, 5, 4, 9, 8, 7, 10, 11 ]