30.两两交换链表中的节点

题目链接

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

解法1 暴力解法

思路

两两交换节点,既然通过链表不好修改,那是不是可以将节点缓存到数组当中。

然后修改它们的顺序,最后再逐一修改 next 指针就好。

代码

js 复制代码
function swapPairs(head: ListNode | null): ListNode | null {
    if (!head) {
        return null;
    }
    if (!head.next) {
        return head;
    }
    let cur = head;
    const nodeList = [];
    while (cur) {
        nodeList.push(cur);
        cur = cur.next;
    }
    
    // 交换数组中链表的顺序
    for (let i = 0; i < nodeList.length && nodeList[i] && nodeList[i + 1]; i = i + 2) {
        const temp = nodeList[i + 1];
        nodeList[i + 1] = nodeList[i];
        nodeList[i] = temp;
    }
    
    // 修改每个节点的 next 指针
    for (let i = 0; i < nodeList.length; i++) {
        nodeList[i].next = i === nodeList.length - 1 ? null : nodeList[i + 1];
    }

    return nodeList[0];
};

时空复杂度

时间复杂度:三次遍历 O(n)

空间复杂度:使用额外数组存储 O(n)

解法2 虚拟头节点+双指针

思路

每当需要交换节点或者删除节点等操作,需要获取当前节点的上一个节点,以便操作 next 指针的时候,就可以考虑引入虚拟头节点。

这一题也是一样,两两交换节点时,需要获取上一个节点来操作指针。于是新建一个 dummyHead 连接到 head

再用 prev 变量指向上一个节点,循环遍历链表,两两交换,所以结束条件是当前节点和下一节点存在。

此时有三个节点 prev => first => second

而最终需要交换成 prev => second => first

交换完之后,指针向前走,此时 prev 需要指向 first,它才是下一个两两交换节点的前一个节点。

代码

js 复制代码
function swapPairs(head: ListNode | null): ListNode | null {
    const dummyHead = new ListNode(-1, head);
    let prev = dummyHead;

    while (head && head.next) {
        const first = head;
        const second = head.next;

        prev.next = second;
        first.next = second.next;
        second.next = first;

        prev = first;
        head = first.next;
    }

    return dummyHead.next;
};

时空复杂度

时间复杂度:1次遍历 O(n)

空间复杂度:常数变量 O(1)

相关推荐
Two_brushes.42 分钟前
【算法】宽度优先遍历BFS
算法·leetcode·哈希算法·宽度优先
小小小小宇4 小时前
虚拟列表兼容老DOM操作
前端
悦悦子a啊4 小时前
Python之--基本知识
开发语言·前端·python
安全系统学习5 小时前
系统安全之大模型案例分析
前端·安全·web安全·网络安全·xss
涛哥码咖5 小时前
chrome安装AXURE插件后无效
前端·chrome·axure
OEC小胖胖5 小时前
告别 undefined is not a function:TypeScript 前端开发优势与实践指南
前端·javascript·typescript·web
行云&流水6 小时前
Vue3 Lifecycle Hooks
前端·javascript·vue.js
Sally璐璐6 小时前
零基础学HTML和CSS:网页设计入门
前端·css
老虎06276 小时前
JavaWeb(苍穹外卖)--学习笔记04(前端:HTML,CSS,JavaScript)
前端·javascript·css·笔记·学习·html
灿灿121386 小时前
CSS 文字浮雕效果:巧用 text-shadow 实现 3D 立体文字
前端·css