# 反转链表,每 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 ]