leetcode:两两交换链表中的节点

56 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

题目描述

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

image.png

示例 1:

输入:head = [1,2,3,4]

输出:[2,1,4,3]

示例 2:

输入:head = []

输出:[]

示例 3:

输入:head = [1]

输出:[1]

提示:

链表中节点的数目在范围 [0, 100] 内

0 <= Node.val <= 100

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

解题思路

本题的递归和非递归解法其实原理类似,都是更新每两个点的链表形态完成整个链表的调整。

其中递归解法可以作为典型的递归解决思路进行讲解。

递归写法要观察本级递归的解决过程,形成抽象模型,因为递归本质就是不断重复相同的事情。而不是去思考完整的调用栈,一级又一级,无从下手。我们应该关注一级调用小单元的情况,也就是单个f(x)。

步骤:

  1. 设置一个 dummy 节点简化操作,dummy next 指向 head。
  2. 初始化 first 为第一个节点
  3. 初始化 second 为第二个节点
  4. 初始化 current 为 dummy
  5. first.next = second.next
  6. second.next = first
  7. current.next = second
  8. current 移动两格
  9. 重复

代码:

var swapPairs = function (head) {

    const dummy = new ListNode(0);
    dummy.next = head;
    let current = dummy;
    
    while (current.next != null && current.next.next != null) {
        // 初始化双指针
        const first = current.next;
        const second = current.next.next;
        // 更新双指针和 current 指针
        first.next = second.next;
        second.next = first;
        current.next = second;
        // 更新指针
        current = current.next.next;
    }
    return dummy.next;

};

总结: 考察链表这种数据结构的特点和使用以及如何使用 dummyHead 简化操作。