「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
题目:24. 两两交换链表中的节点
分析
- 这和k个一组翻转链表很相似,我们利用上节课程讲的数组的方法来解这个题目;
var swapPairs = function (head, k = 2) {
if (head == null || head.next == null) return head;
const arr = [];
let i = 0;
for (let m = head; m != null; m = m.next) {
arr[i++] = m;
}
if (arr.length < k) {
return head;
}
let prev = null;
let len = arr.length;
for (let j = k - 1; j < len; j += k) {
for (let s = j; s > j - k + 1; s--) {
arr[s].next = arr[s - 1];
}
if (prev) {
// 将上一次的尾部指向新的头部
prev.next = arr[j];
} else {
// 第一次记录头节点
head = arr[j];
}
// 上一次翻转后的尾部;
prev = arr[j - k + 1];
// 最后一次数量小于k个
if (len - j - 1 < k) {
prev.next = arr[j + 1];
}
}
// 尾部没有多余节点
if (arr.length % k === 0) {
arr[arr.length - 1 - k + 1].next = null;
}
return head;
};