链表-两两交换(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

聚类分析算法——K-means聚类 详解

聚类分析算法——K-means聚类 详解

K-means 聚类是一种常用的基于距离的聚类算法,旨在将数据集划分为   个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面,我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。 1. K-means 的核心思想         K-means 的目标是将数据集划分为   个簇(clusters),使得每个数据点属于距离最近的簇中心。通过反复调整簇中心的位置,K-means 不断优化簇内的紧密度,从而获得尽量紧凑、彼此分离的簇。 核心思想 * 簇(Cluster):K-means 通过最小化簇内距离的平方和,使得数据点在簇内聚集。一个簇是数据点的集合,这些点在某种意义上“彼此相似”。比如,可以将商场顾客分为“学生群体”“上班族”“退休老人”这三个簇。 * 簇中心(Centroid):簇中心是簇中所有点的平均值,表示簇的中心位置。 * 簇分配和更新:

By Ne0inhk
【C++:哈希表封装】用哈希表封装unordered_map和unordered_set

【C++:哈希表封装】用哈希表封装unordered_map和unordered_set

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶、测试开发要点全知道 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 🎬艾莉丝的C++专栏简介: C++的两个参考文档  老朋友(非官方文档):cplusplus 官方文档(同步更新):C++ 官方参考文档 set和multiset的参考文档:set、multiset map和multimap的参考文档:map、multimap unordered_set和unordered_multiset的参考文档:unordered_set、unordered_multiset unordered_map和unordered_multimap的参考文档: unordered_map、unordered_

By Ne0inhk
哈希表封装 myunordered_map/myunordered_set 实战:底层原理 + 完整实现

哈希表封装 myunordered_map/myunordered_set 实战:底层原理 + 完整实现

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 源码及框架分析 * 二. 核心设计思路:哈希表的泛型复用 * 2.1 哈希表模板参数设计 * 三. 实现出复用哈希表的框架,并支持insert * 四. 实现iterator和map支持[]的功能 * 4.1 迭代器实现:支持哈希桶遍历 * 4.2 map支持[] * 五. 完整代码实现 * 5.1 HashTable.h * 5.2 unordered_set.h * 5.3 unordered_map.h

By Ne0inhk
【数据结构手札】顺序表实战指南(五):查找 | 任意位置增删

【数据结构手札】顺序表实战指南(五):查找 | 任意位置增删

🌈个人主页:聆风吟 🔥系列专栏:数据结构手札 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 * 📚专栏订阅推荐 * 📋前言 - 顺序表文章合集 * 一. ⛳️顺序表:重点回顾 * 1.1 🔔顺序表的定义 * 1.2 🔔顺序表的分类 * 1.2.1 👻静态顺序表 * 1.2.2 👻动态顺序表 * 二. ⛳️顺序表的基本操作实现 * 2.1 🔔查找某个值的下标 * 2.2 🔔在下标为pos位置插入x * 2.3 🔔删除下标为pos位置的数据 * 三. ⛳️顺序表的源代码 * 3.1 🔔SeqList.h 顺序表的函数声明 * 3.2 🔔SeqList.c

By Ne0inhk