【路飞】链表-两两交换链表中的节点

144 阅读1分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

题目:24. 两两交换链表中的节点

image.png

分析

  1. 这和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;
};