当前位置: 首页 > news >正文

LeetCode 热题 100 24. 两两交换链表中的节点

LeetCode 热题 100 | 24. 两两交换链表中的节点

大家好,今天我们来解决一道经典的链表问题——两两交换链表中的节点。这道题在 LeetCode 上被标记为中等难度,要求两两交换链表中的相邻节点,并返回交换后链表的头节点。


问题描述

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

示例 1:

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

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

提示:

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

解题思路

核心思想
  1. 虚拟头结点

    • 使用一个虚拟头结点 dummy,其 next 指向链表的头结点。这可以简化对头结点的处理。
  2. 两两交换

    • 使用一个指针 prev,初始时指向虚拟头结点。
    • 每次交换 prev.nextprev.next.next 指向的两个节点。
    • 更新指针,继续处理下一对节点。
  3. 特殊情况

    • 如果链表为空或只有一个节点,直接返回原链表。

Python代码实现

class Solution:def swapPairs(self, head: ListNode) -> ListNode:# 创建一个虚拟头结点dummy = ListNode(0)dummy.next = headprev = dummywhile prev.next and prev.next.next:# 定义需要交换的两个节点first = prev.nextsecond = prev.next.next# 交换节点prev.next = secondfirst.next = second.nextsecond.next = first# 移动 prev 指针prev = firstreturn dummy.next

代码解析

  1. 虚拟头结点

    • 创建一个虚拟头结点 dummy,并将其 next 指向链表的头结点。这可以简化对头结点的处理。
  2. 初始化指针

    • 初始化指针 prev,指向虚拟头结点。
  3. 两两交换

    • 使用 while 循环,条件是 prev.nextprev.next.next 都不为 None
    • 定义需要交换的两个节点 firstsecond
    • 交换节点:
      • prev.next 指向 second
      • first.next 指向 second.next
      • second.next 指向 first
    • 更新 prev 指针,继续处理下一对节点。
  4. 返回结果

    • 返回 dummy.next,即交换后的链表头结点。

复杂度分析

  • 时间复杂度:O(n),其中 n 是链表的长度。每个节点只被访问一次。
  • 空间复杂度:O(1),只使用了常数级别的额外空间。

示例运行

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

总结

通过使用虚拟头结点和两两交换的方法,我们可以高效地完成链表中相邻节点的交换。这种方法在 O(n) 时间复杂度内完成,并且只使用了 O(1) 的额外空间。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

关注我,获取更多算法题解和编程技巧!

http://www.dtcms.com/a/183287.html

相关文章:

  • JS正则表达式介绍(JavaScript正则表达式)
  • AI与机器人学:从SLAM到导航的未来
  • leetcode 2918. 数组的最小相等和 中等
  • Windows右键管理工具:轻松添加/删除/修改右键菜单项!
  • 常见的算法介绍
  • c++ struct类型加强
  • Python实例题:Python协程详解公开课
  • 如何让“语言不通”的纺织设备通过Profinet转CanOpen网关“聊”起来?
  • Ethercat转Profinet网关如何用“协议翻译术“打通自动化产线任督二脉
  • 数据库中的 Segment、Extent、Page、Row 详解
  • Vue3响应式原理源码解析(通俗易懂版)
  • C PRIMER PLUS——第7节:指针
  • OC语言学习——Foundation框架(上)
  • adamantix系统详细讲解
  • 数据结构与算法:树型dp
  • [C++] 大数减/除法
  • 鸿蒙 所有API缩略图鉴
  • Web3 初学者的第一个实战项目:留言上链 DApp
  • 质量保证计划,软件质量计划书,软件质量方案(word原件)
  • FHE 之 面向小白的引导(Bootstrapping)
  • 6.秒杀优化
  • HTTP:十三.HTTP日志
  • 数据库版本控制工具--flyway
  • CSDN 中 LaTeX 数学公式输入方法
  • 思考:(linux) tmux 超级终端快速入门的宏观思维
  • c++ using使用
  • 通信原理绪论
  • JDBC工具类的三个版本
  • 【python】json解析:invalid literal for int() with base 10: ‘\“\“‘“
  • 工厂节能新路径:精准节能的深度剖析