当前位置: 首页 > 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) 的额外空间。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

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

相关文章:

  • 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)
  • 习近平会见委内瑞拉总统马杜罗
  • 东洋学人|滨田青陵:近代日本考古学第一人
  • 重温经典|《南郭先生》:不模仿别人,不重复自己
  • 重庆党政代表团在沪考察,陈吉宁龚正与袁家军胡衡华共商两地深化合作工作
  • 98岁动物学家、北京大学教授杨安峰逝世
  • 两部门发布外汇领域行刑反向衔接案例,织密金融安全“防护网”