链表-两两交换(Java的三种解法)

链表-两两交换(Java的三种解法)

道题是链表操作的一个经典问题,掌握了它,你对链表的指针操作和递归思维会有更深的理解。只要你跟着我的思路走一遍,自己动手写写代码,很快就能独立解决这类问题!咱们现在就来聊聊这道题吧


1. 看到这道题目时我想到了什么,以及如何运用现实案例讲解

你有没有想过,生活中很多事情都像是“交换顺序”或者“重新排列”。比如说,你在排队买东西,队伍里的人两两交换位置,前面的人变成后面,后面的人变成前面,这就是一种“两两交换”的操作。

再举个贴近算法的例子:想象你在整理一排书,原本是按顺序摆放的,但你想把相邻的两本书交换位置,比如第1本和第2本换,第3本和第4本换,这样整个书架的顺序就变了。这就像链表的两两交换,我们需要调整指针,让相邻节点的位置互换。

业务场景:这道题在实际业务中有很多应用,比如:

  • 数据排序:在某些场景下,需要对数据进行局部重排,比如用户列表中两两交换显示顺序,用于A/B测试。
  • 任务调度:在任务队列中,调整任务执行顺序,比如优先级相邻任务交换,提升调度效率。
  • 游戏设计:在游戏排行榜中,动态调整玩家位置,比如相邻玩家交换,用于视觉效果或平衡机制。

2. 解法分析:至少3种解法,最优解法和最快解法

解法1:递归(Recursion)——直观且代码简洁

思路:用递归的方式处理链表的两两交换。每次处理当前节点和下一个节点,交换它们的位置,然后递归处理剩余的链表。终止条件是当前节点为空或下一个节点为空。

  • 时间复杂度:O(n),n是链表节点数量,每个节点只处理一次。
  • 空间复杂度:O(n),由于递归调用栈,最坏情况下为链表长度。
解法2:迭代(Iteration with Dummy Node)——更符合工程实践

思路:用迭代的方式处理链表,引入一个哑节点(dummy node)作为辅助,方便处理头节点交换。每次处理一对节点,调整指针完成交换,然后移动到下一对节点。

  • 时间复杂度:O(n),每个节点只遍历一次。
  • 空间复杂度:O(1),只用常数级额外空间。
解法3:迭代(Iteration without Dummy Node)——直接操作头节点

思路:与解法2类似,但不引入哑节点,直接操作头节点。需要额外处理头节点交换的情况,代码逻辑稍复杂,但也能实现两两交换。

  • 时间复杂度:O(n),每个节点只遍历一次。
  • 空间复杂度:O(1),只用常数级额外空间。
最优解法和最快解法
  • 最优解法:如果追求代码可读性和工程实践,推荐迭代解法(带哑节点),因为它空间复杂度低,逻辑清晰,容易维护。如果是初学者或面试中追求简洁,递归解法也是不错的选择。
  • 最快解法:在实际运行中,**迭代解法(带哑节点)**通常是最快的,因为它避免了递归的调用栈开销,且指针操作效率高。

迭代解法(带哑节点)模板(Java)

publicListNodeswapPairs(ListNode head){ if(head ==null|| head.next ==null)return head;ListNode dummy =newListNode(0); dummy.next

Read more

【C++:多态】C++多态实现深度剖析:从抽象类约束到虚函数表机制

【C++:多态】C++多态实现深度剖析:从抽象类约束到虚函数表机制

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 🎬艾莉丝的C++专栏简介: 目录 本文内容索引 C++的两个参考文档 3  ~>   纯虚函数与抽象类:从语法规范到底层约束 3.1  纯虚函数的语法语义深度解析 3.2  抽象类的设计意义与使用场景 3.3  实践验证:抽象类实例化的编译器级限制 3.3.1   分析:抽象类实例化编译错误 3.3.2  对象实例化条件验证 3.3.

By Ne0inhk
Visual C++ 6.0 中文版安装包下载及 Win11 安装教程

Visual C++ 6.0 中文版安装包下载及 Win11 安装教程

本文分享的是 Visual C++ 6.0(简称 VC++ 6.0)中文版的安装包下载及安装教程,包括在 Win11 系统下的安装和使用问题解答。如果您在安装过程中遇到任何问题,请随时留言寻求帮助! 一、安装包的下载 vc6.0 安装包下载链接:点击这里下载 https://pan.quark.cn/s/bc24c385ee87 二、安装 VC++ 6.0 等待安装完成: 点击“安装”开始安装: 创建桌面快捷方式,然后点击“下一步”。 完成后点击“下一步”。 选择 C 盘以外的盘符: 更改安装路径,建议不要安装在 C 盘(默认盘符),可以选择其他的盘符,

By Ne0inhk

GCC 14编译选项配置实战(高性能C++构建秘籍)

第一章:GCC 14编译器的新特性与构建环境准备 GCC 14作为GNU编译器集合的最新稳定版本,引入了多项增强功能,显著提升了C++标准支持、诊断能力以及优化性能。开发者在使用前需确保构建环境满足最低依赖要求,并正确配置工具链。 核心新特性概览 * 全面支持C++23关键特性,包括std::expected和模板参数冗余推导 * 增强静态分析能力,新增对未定义行为的深度检测机制 * 优化跨函数边界内联策略,提升生成代码的执行效率 * 引入更精准的调试信息格式(DWARF-5),改善GDB调试体验 构建环境搭建步骤 在主流Linux发行版中安装GCC 14,推荐通过官方源或自定义编译方式获取: # 添加Ubuntu Toolchain PPA并安装 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt install gcc-14 g++-14 # 设置默认编译器版本 sudo update-alternatives --install /usr/bin/

By Ne0inhk
【C++】B2108 图像模糊处理

【C++】B2108 图像模糊处理

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]本文专栏: C++ 文章目录 * 💯前言 * 💯题目描述 * 题目内容 * 输入格式 * 输出格式 * 示例 * 输入: * 输出: * 💯题目分析 * 问题拆解 * 💯我的做法 * 代码实现 * 代码分析 * 💯老师的做法 * 代码实现 * 代码分析 * 💯两种实现的对比 * 💯相关概念拓展 * 1. 四舍五入的实现 * 2. 二维数组的边界处理 * 💯优化建议 * 💯小结 💯前言 在C++程序设计学习中,处理二维数组与图像问题是一个重要的实践内容,能够帮助我们熟悉矩阵操作、边界条件处理以及浮点运算等核心技能。本篇文章将以一个图像模糊处理的题目为切入点,详细剖析题目背景、解题思路与两种代码实现(我的做法与老师的代码),并对两者进行深入比较与优化。同时,还将补充相关概念的详细解析,以期让读者对问题有全面而深入的理解。 C++ 参考手册 💯题目描述 题目来源于一个二维矩阵的图像模糊处理问题,其具体要求如下

By Ne0inhk