【力扣算法19】之 24. 两两交换链表中的节点 python

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 【力扣算法19】之 24. 两两交换链表中的节点 python

问题描述

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

示例1

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

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

示例2

输入:head = []

输出:[]

示例3

输入:head = [1]

输出:[1]

提示

  • 链表中节点的数目在范围 [0, 100] 内
  • 0 <= Node.val <= 100

思路分析

这个问题要求我们对给定链表中的节点进行两两交换,并返回交换后的链表。我们需要在不修改节点的值的情况下完成交换,只能通过调整节点之间的连接关系来实现。

我们可以使用递归的方法解决这个问题。

  1. 首先判断当前链表是否为空或者只有一个节点。如果是,则无需交换,直接返回原链表。
  2. 如果链表中至少有两个节点,我们可以将第一个节点和第二个节点进行交换。交换后,第二个节点变为新的头节点,第一个节点变为新的第二个节点。
  3. 我们将原链表的头节点指向第二个节点,即交换后的新头节点。然后,将原头节点的next指针指向递归调用swapPairs函数的返回结果,即第三个节点和后面节点交换后的链表。
  4. 最后,返回交换后的新头节点。

递归函数的终止条件是当前链表为空或者只有一个节点。

这种递归的思路可以保证每次交换一对节点,并正确地连接它们与后面的节点。

例如,对于链表[1,2,3,4],按照上述步骤进行交换:

  • 首先交换1和2,得到新的头节点2,1成为新的第二个节点。
  • 原头节点1的next指向递归调用swapPairs函数的结果,即4和后面节点交换后的链表。
  • 递归调用处理4和后面节点交换的过程,得到新的头节点4。
  • 最后将2的next指针指向4,完成整个链表的交换。


代码分析


首先, 检查当前链表是否为空或者只有一个节点。如果是,说明无需交换,直接返回原链表。

然后, 定义两个指针prev和cur,分别指向要交换的两个节点,其中prev指向第一个节点,cur指向第二个节点。

接下来, 将prev的next指针指向cur的next节点,即将第一个节点的后继指针指向第三个节点。

然后,将cur的next指针指向prev,完成节点的交换。

接着, 递归地处理剩余部分的链表,即将第三个节点及其后面的节点作为参数传入swapPairs函数中,并获得返回的结果。

最后,将交换后的新头节点cur返回。


完整代码


class Solution(object):
    def swapPairs(self, head):
        # 检查当前链表是否为空或者只有一个节点
        if not head or not head.next:
            return head
        # 定义prev指针指向当前要交换的两个节点中的第一个节点
        prev = head
        # 定义cur指针指向当前要交换的两个节点中的第二个节点
        cur = head.next
        # 将prev的next指针指向cur的next节点
        prev.next = self.swapPairs(cur.next)
        # 将cur的next指针指向prev,完成节点的交换
        cur.next = prev
        # 返回交换后的链表的头节点
        return cur

详细分析


class Solution(object):
    def swapPairs(self, head):
• 1
• 2

这是定义了一个名为Solution的类,并声明了一个名为swapPairs的方法。该方法接受一个参数head,表示链表的头节点。

# 检查当前链表是否为空或者只有一个节点
        if not head or not head.next:
            return head

在这里,首先检查链表是否为空或者只有一个节点。如果是,说明无需进行交换,直接返回原链表。

# 定义prev指针指向当前要交换的两个节点中的第一个节点
        prev = head
        # 定义cur指针指向当前要交换的两个节点中的第二个节点
        cur = head.next

这两行代码定义了两个指针prevcur,分别指向当前要交换的两个节点。prev指向第一个节点,cur指向第二个节点。

# 将prev的next指针指向cur的next节点
        prev.next = self.swapPairs(cur.next)

这一行代码将prevnext指针指向curnext节点,实现了节点的交换。同时,使用递归调用swapPairs方法来处理剩余部分的链表,并将返回的结果赋值给prev.next,即连接交换后的节点。

# 将cur的next指针指向prev,完成节点的交换
        cur.next = prev

这一行代码将curnext指针指向prev,完成了节点的交换。交换后,prev变为了第二个节点,cur变为了第一个节点。

# 返回交换后的链表的头节点
        return cur

最后,返回交换后的链表的头节点cur

整体思路是通过递归不断处理每一对节点进行交换,直到链表末尾或者只剩下一个节点。在每次递归中,首先交换当前两个节点,然后继续递归地处理剩余部分的链表。最终得到交换后的链表。


运行效果截图


完结


相关文章
|
10月前
|
机器学习/深度学习 运维 算法
基于粒子群优化算法的配电网光伏储能双层优化配置模型[IEEE33节点](选址定容)(Matlab代码实现)
基于粒子群优化算法的配电网光伏储能双层优化配置模型[IEEE33节点](选址定容)(Matlab代码实现)
964 0
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
10月前
|
机器学习/深度学习 并行计算 算法
基于改进的粒子群算法PSO求解电容器布局优化问题HV配电中的功率损耗和成本 IEEE34节点(Matlab代码实现)
基于改进的粒子群算法PSO求解电容器布局优化问题HV配电中的功率损耗和成本 IEEE34节点(Matlab代码实现)
169 1
|
10月前
|
并行计算 算法 安全
【ADMM、碳排放】基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究【IEEE6节点、IEEE30节点、IEEE118节点】(Matlab代码实现)
【ADMM、碳排放】基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究【IEEE6节点、IEEE30节点、IEEE118节点】(Matlab代码实现)
522 0
|
11月前
|
机器学习/深度学习 算法 数据挖掘
基于自适应遗传算法风光场景生成的电动汽车并网优化调度【IEEE33节点】(Matlab代码实现)
基于自适应遗传算法风光场景生成的电动汽车并网优化调度【IEEE33节点】(Matlab代码实现)
262 0
|
SQL 分布式计算 DataWorks
使用DataWorks PyODPS节点调用XGBoost算法
本文介绍如何在DataWorks中通过PyODPS3节点调用XGBoost算法完成模型训练与测试,并实现周期离线调度。主要内容包括:1) 使用ODPS SQL构建数据集;2) 创建PyODPS3节点进行数据处理与模型训练;3) 构建支持XGBoost的自定义镜像;4) 测试运行并选择对应镜像。适用于需要集成机器学习算法到大数据工作流的用户。
578 24
|
传感器 算法 数据安全/隐私保护
基于GA遗传优化的三维空间WSN网络最优节点部署算法matlab仿真
本程序基于遗传算法(GA)优化三维空间无线传感网络(WSN)的节点部署,通过MATLAB2022A实现仿真。算法旨在以最少的节点实现最大覆盖度,综合考虑空间覆盖、连通性、能耗管理及成本控制等关键问题。核心思想包括染色体编码节点位置、适应度函数评估性能,并采用网格填充法近似计算覆盖率。该方法可显著提升WSN在三维空间中的部署效率与经济性,为实际应用提供有力支持。
|
传感器 算法 物联网
基于粒子群算法的网络最优节点部署优化matlab仿真
本项目基于粒子群优化(PSO)算法,实现WSN网络节点的最优部署,以最大化节点覆盖范围。使用MATLAB2022A进行开发与测试,展示了优化后的节点分布及其覆盖范围。核心代码通过定义目标函数和约束条件,利用PSO算法迭代搜索最佳节点位置,并绘制优化结果图。PSO算法灵感源于鸟群觅食行为,适用于连续和离散空间的优化问题,在通信网络、物联网等领域有广泛应用。该算法通过模拟粒子群体智慧,高效逼近最优解,提升网络性能。
543 16
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
289 0
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
558 3