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

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(N)
    • 空间复杂度:O(1)

整体思路

这段代码旨在解决一个经典的链表操作问题:两两交换链表中的节点 (Swap Nodes in Pairs)。问题要求将链表中每两个相邻的节点进行交换,并返回交换后的链表。例如,1->2->3->4 应变为 2->1->4->3

该算法采用了一种 迭代 的方法,通过精心设计的指针操作来完成节点的交换。为了简化边界情况(特别是头节点的交换),它也巧妙地运用了 哨兵节点 (Sentinel Node)

其核心逻辑步骤如下:

  1. 初始化

    • 哨兵节点:创建一个 dummy 节点,其 next 指向原始链表的头节点 head。这使得对第一对节点的交换与其他节点的交换逻辑完全统一。
    • 指针设置
      • left 指针:初始化为 dummy。这个指针将始终指向待交换的一对节点的前一个节点。它的作用是连接上一组交换好的部分和当前正在交换的部分。
      • right 指针:初始化为 head。这个指针将始终指向待交换的一对节点中的第一个节点
  2. 迭代交换

    • 算法使用一个 while 循环来遍历并交换节点对。
    • 循环条件while (null != right && null != right.next)。这个条件确保了至少还有一对完整的节点(rightright.next)可供交换。如果链表为空、只有一个节点,或者只剩最后一个节点,循环都不会执行。
    • 在循环内部(核心交换逻辑)
      • 假设当前结构是 ... -> left -> right -> right.next -> ...。目标是变为 ... -> left -> right.next -> right -> ...
      • left.next = right.next;:首先,将 leftnext 指针指向 right 的下一个节点。这是将交换后的新“头”节点连接到前面的链表上。
      • right.next = right.next.next;:接着,将 rightnext 指针指向它原来下一个节点的下一个节点,即跳过中间的节点。
      • left.next.next = right;:最后,将原来 right.nextnext 指针指向 right,完成两个节点的交换。
    • 指针前移
      • left = right;:完成一对交换后,right 节点现在是这一对中的第二个(在后面)。我们需要为下一轮交换做准备,所以将 left 指针移动到 right 的位置。
      • right = left.next;:将 right 指针移动到下一对节点的第一个节点。
  3. 返回结果

    • 循环结束后,所有节点对都已交换完毕。dummy.next 指向了交换后链表的真正头节点,将其返回。

完整代码

/*** Definition for singly-linked list.*/
class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val = val; }ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}class Solution {/*** 两两交换链表中的节点。* @param head 原始链表的头节点* @return 交换后链表的头节点*/public ListNode swapPairs(ListNode head) {// 创建一个哨兵节点,简化头节点交换的逻辑。ListNode dummy = new ListNode(0, head);// left 指针指向待交换对的前一个节点。ListNode left = dummy;// right 指针指向待交换对的第一个节点。ListNode right = head;// 循环条件:确保至少还有一对完整的节点可以交换。while (null != right && null != right.next) {// 核心交换逻辑,可以想象为三步指针重定向:// 假设原始是: left -> n1 -> n2 -> ...// 其中 n1 是 right, n2 是 right.next// 1. left 的 next 指向 n2left.next = right.next;// 2. n1 的 next 指向 n2 原来的 nextright.next = right.next.next;// 3. n2 的 next 指向 n1left.next.next = right;// 交换后,链表变为: left -> n2 -> n1 -> ...// 为下一轮交换做准备,移动指针:// left 移动到 n1 的位置left = right;// right 移动到 n1 的下一个位置,即下一对的第一个节点right = left.next;}// 返回哨兵节点的下一个节点,即新链表的头。return dummy.next;}
}

时空复杂度

时间复杂度:O(N)

  1. 循环次数while 循环遍历整个链表。right 指针每次前进两步(逻辑上)。整个链表被扫描了一次。
  2. 每次操作:在循环的每一次迭代中,执行的都是常数次(固定次数)的指针赋值操作。

综合分析
算法的时间复杂度与链表的长度 N 成线性关系。因此,时间复杂度为 O(N)

空间复杂度:O(1)

  1. 主要存储开销:算法只创建了 dummy, left, right 等几个额外的指针变量。
  2. 空间大小:这些变量的数量是固定的,与输入链表的长度 N 无关。

综合分析
算法没有使用任何与输入规模成比例的额外数据结构。因此,其额外辅助空间复杂度为 O(1)。这是一个高效的原地算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914010.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914010.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914010.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微积分核心考点全解析

一、微积分核心知识框架 1. 极限与连续(重点!) 核心概念: 极限定义(ε-δ语言)重要极限:lim⁡x→0sin⁡xx1limx→0​xsinx​1,lim⁡x→∞(11x)xelimx→∞​(1x1​)xe连续性判定&am…

TypeScript---泛型

一.简介TypeScript 就引入了“泛型”(generics)。泛型的特点就是带有“类型参数”(type parameter)。在日常 TypeScript 编程中,我们经常会遇到这样的场景:函数的参数类型与返回值类型密切相关。此时&#…

手把手一起使用Miniforge3+mamba平替Anaconda(Win10)

Anaconda 开始对企业收费,目前急需平替Anaconda。这里采用Minforgemamba作为替代,可以避免Anaconda追责,并100%兼容原conda仓库及使用方式,如果各位小伙伴有更好的平替方式,欢迎分享。 Miniforge3安装 下载并安装Min…

【Note】Linux Kernel 主题学习之“完整的嵌入式 Linux 环境、构建工具、编译工具链、CPU 架构”

Linux Kernel 主题学习之“完整的嵌入式 Linux 环境、构建工具、编译工具链、CPU 架构” 一、完整的嵌入式 Linux 环境 一个嵌入式 Linux 系统通常包括以下关键组件(以 Jetson、树莓派等 ARM 版 SBC 为例): 交叉编译工具链(cros…

Lecture #20:Database Logging

Lecture20目录:崩溃恢复缓冲池管理策略窃取策略强制策略NO-STEAL-FORCE影子分页执行恢复缺点日志文件预写日志(WAL)执行缓冲池策略日志方案检查点崩溃恢复 恢复算法是一种确保数据库ACID的技术,数据库崩溃后, 所有已经…

Kubernetes高级调度1

目录 一:初始化容器 Initcontainer 1:Initcontainer 的基本概念 2:示例 1--延迟指定时间后启动 3:示例 2--使用初始化容器修改内核参数 4:示例 3--等待依赖服务启动 4:pause容器 二:临时容器 Ephemeral Containers 1.临时容器的概念 2.临时容器的使用 三&a…

服务器机柜与网络机柜各自的优势

一、服务器机柜优势服务器机柜设计有强大的承重结构,能承受大量服务器设备堆叠产生的重量,保障设备安全稳定放置,防止因承重不足导致机柜变形甚至设备损坏,同时,服务器在运行的过程中,会产生大量热量&#…

AI技术通过提示词工程(Prompt Engineering)正在深度重塑职场生态和行业格局,这种变革不仅体现在效率提升,更在重构人机协作模式。

AI技术通过提示词工程(Prompt Engineering)正在深度重塑职场生态和行业格局,这种变革不仅体现在效率提升,更在重构人机协作模式。以下是关键影响维度及未来趋势分析:一、职场效率革命(效率提升300%场景&…

Hugging Face 开源机器人 Reachy Mini 开启预定

我们最新的开源机器人 Reachy Mini 正式亮相 🎉 这款富有表现力的开源机器人由 Pollen Robotics 与 Hugging Face 联合打造,专为人机交互、创意编程和 AI 实验而设计。它价格亲民,体积小巧,却蕴藏着无限可能。来自全球的各个年龄段…

vue3+node.js+mysql写接口(二)

目录 一、产品模块(products表) 1.1、添加产品(/adminapi/product/add) 1.2、产品列表(/adminapi/product/list) 1.3、编辑产品(/adminapi/product/update) 1.4、首页产品联动 二、前台模块 2.1、路由配置 2.2、NavBar组件 2.3、新闻搜索 2.4、新闻选项卡 2.5、新闻…

解析LLM层裁剪:Qwen实战指南

怎么实现对LLM 部分层裁剪输出结果 Qwen 7b 是28层MLP,28头 Qwen 14b 是48层MLP,40头,词向量维度:5120 模型加载部分 from transformers import AutoTokenizer, AutoModelForCausalLM

【AI大模型】深度学习正则化技术:Batch Normalization (BatchNorm) 详解

1. 为什么需要 BatchNorm? - 问题的根源:Internal Covariate Shift (ICS)问题描述: 深度神经网络在训练过程中,随着网络层数的加深,前面层参数的微小更新会导致后面层输入数据的分布发生显著变化。这种现象称为内部协变…

20.缓存问题与解决方案详解教程

文章目录1. 缓存基础概念1.1 什么是缓存1.2 缓存的作用1.3 常见的缓存类型1.4 缓存架构示例2. 缓存雪崩 (Cache Avalanche)2.1 什么是缓存雪崩2.2 缓存雪崩的原因2.3 缓存雪崩的危害2.4 缓存雪崩的解决方案方案1:设置随机过期时间方案2:缓存集群和主从复…

(满满的坑LLAMA3使用申请被拒绝rejected)利用huggingface导入LLAMA3模型

文章目录前言坑后续前言 大家都知道,使用huggingface导入大模型是使用如下办法 from transformers import AutoModelForCausalLM, AutoTokenizermodel_name "Qwen/Qwen2.5-7B-Instruct"#要导入的大模型名称。model AutoModelForCausalLM.from_pretrai…

大规模集群下 Prometheus 监控架构实战经验分享

大规模集群下 Prometheus 监控架构实战经验分享 1 业务场景描述 在互联网金融业务发展过程中,我们需要对数千台主机、上万容器与微服务实例进行指标监控,并统计历史数据以支持 SLA 报表、告警与容量规划。传统监控系统面临以下挑战: 实例动态…

主流消息队列技术总结和对比

消息队列(Message Queue,简称 MQ)作为构建分布式互联网应用的关键组件,松耦合的架构设计能显著提升系统的可用性与可扩展性。在分布式系统中扮演着至关重要的角色,主要承担着实现异步消息传递、应用解耦、流量削峰以及…

数据结构 顺序表(3)---顺序表的应用

在之间的两篇文章中,我们着重讲了顺序表及顺序表的实现。今天这篇文章我们将简单讲解关于顺序表的三个算法题。这三个题也都属于力扣上的经典例题。1.例题1:移除元素例题来源(力扣) : https://leetcode.cn/problems/remove-element/description/这是一道数组操作算法…

逆向入门(9)汇编篇-bound指令的学习

看程序的时候碰到这么一行没见过的代码,简单记录一下 00427AC8 |. 6215 3C7B4200 |bound edx,qword ptr ds:[0x427B3C]这里是用到了bound指令,这是 x86 汇编中的指令,用于检查数组索引是否在有效范围内。 指令解析 bound edx, qword ptr ds…

【web应用】若依框架中,使用Echarts导出报表为PDF文件

文章目录前言一、Echarts准备工作1、查看是否安装了Echarts2、Echarts导入script 中3、使用Echarts创建图表二、报表制作打印html2canvas和jsPDF准备工作1、安装html2canvas和jsPDF依赖包2、html2canvas和jsPDF引用到script中3、制作并打印报表三、导出结果前言 若依框架前端中…

优选算法 --(双指针算法 1~8)

引言:此专栏为记录算法学习,本专题作为算法学习的第一部分,优选算法专题共计100题,分为不同小模块进行,算法学习需坚持积累,时代不会辜负长期主义者,仅以此句,与君共勉。 讲解算法分…