[路飞]_Leetcode 24. 两两交换链表中的节点

41 阅读1分钟

看清「两两交换链表中的节点」的状态,答案便不必追赶,它会自己出现。

—— 耶夫托维斯基

Hello,大家好,今天继续刷 LeetCode 热题 100。

这篇要解决的是 24. 两两交换链表中的节点。

前言

「两两交换链表中的节点」的核心不在代码量,而在于找到正确的数据结构、状态定义或遍历顺序。下面按题目、思路、代码和复杂度把它一步步拆开。

1、题目描述

给定链表,每两个相邻节点交换一次,不能直接改节点值。

2、解题思路

链表题先放一个哨兵节点,能把头节点也当作普通节点处理。pre 指向当前这组前面的节点,若后面不足两个就结束;设两个节点为 a、b,依次把 pre.next 接到 b、a.next 接到下一组、b.next 接回 a。交换完成后 pre 前进到 a,继续处理。

3、代码实现

var swapPairs = function(head) {
  const dummy = new ListNode(0, head);
  let pre = dummy;
  while (pre.next && pre.next.next) {
    const a = pre.next, b = a.next;
    pre.next = b;
    a.next = b.next;
    b.next = a;
    pre = a;
  }
  return dummy.next;
};

4、复杂度分析

时间 O(n),除哨兵外空间 O(1)。

5、思路总结

  • 核心方法:链表题先放一个哨兵节点,能把头节点也当作普通节点处理
  • 关键点:pre 指向当前这组前面的节点,若后面不足两个就结束
  • 实现提醒:设两个节点为 a、b,依次把 pre.next 接到 b、a.next 接到下一组、b.next 接回 a

结语

以上就是「两两交换链表中的节点」的解法。先把关键状态和不变量想清楚,再落到代码,复杂问题也会清晰很多。