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

LeetCode【0024】两两交换链表中的节点

本文目录

  • 1 中文题目
  • 2 求解方法:迭代法
    • 2.1 方法思路
    • 2.2 Python代码
    • 2.3 复杂度分析
  • 3 题目总结

1 中文题目

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

示例:
在这里插入图片描述

链表如上
输入:head = [1,2,3,4]
输出:[2,1,4,3]
输入:head = []
输出:[]
输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [ 0 , 100 ] [0, 100] [0,100]
  • 0 ≤ N o d e . v a l ≤ 100 0 \leq Node.val \leq 100 0Node.val100

2 求解方法:迭代法

2.1 方法思路

方法核心

使用迭代方法,每次处理两个相邻节点。并通过虚拟头节点简化边界情况处理,使用临时变量保存需要交换的节点和下一对节点。

实现步骤

  • 特殊情况处理
    • 空链表直接返回null
    • 只有一个节点直接返回该节点
  • 初始化
    • 创建虚拟头节点dummy
    • 设置prev指向dummy
  • 交换过程
    • 保存当前要交换的两个节点first和second
    • 保存下一对要处理的节点next_pair
    • 执行节点交换的三个步骤
    • 更新指针位置

方法示例

输入:1->2->3->4
过程演示:1. 初始状态:
dummy->1->2->3->4
prev = dummy, head = 12. 第一次交换(1,2):
a. first = 1, second = 2, next_pair = 3
b. 交换后:dummy->2->1->3->4
c. prev = 1, head = 33. 第二次交换(3,4):
a. first = 3, second = 4, next_pair = null
b. 交换后:dummy->2->1->4->3->null
c. prev = 3, head = null4. 循环结束,返回dummy.next
最终结果:2->1->4->3

2.2 Python代码

class Solution:def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:# 如果链表为空或只有一个节点,直接返回if not head or not head.next:return head# 创建虚拟头节点,简化边界情况处理dummy = ListNode(0)dummy.next = head# prev指向当前待交换节点对的前一个节点prev = dummy# 当还有节点对可以交换时继续循环while head and head.next:# 保存要交换的两个节点first = headsecond = head.next# 保存下一对要处理的节点next_pair = second.next# 交换节点对# 1. 将第二个节点指向第一个节点second.next = first# 2. 将前一个节点指向第二个节点(新的首节点)prev.next = second# 3. 将第一个节点指向下一对节点的开始first.next = next_pair# 更新指针,为处理下一对节点做准备prev = firsthead = next_pairreturn dummy.next

2.3 复杂度分析

  • 时间复杂度:O(n),n是链表节点数
    • 只需要遍历一次链表
    • 每个节点最多被访问一次
  • 空间复杂度:O(1)
    • 只使用了常数个额外变量
    • 不需要额外的数据结构

3 题目总结

题目难度:中等
数据结构:链表
应用算法:迭代法


http://www.mrgr.cn/news/72321.html

相关文章:

  • 【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)
  • 前端神经网络入门(三):深度学习与机器学习的关系、区别及核心理论支撑 - 以Brain.js示例
  • PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级
  • 推荐一个超漂亮ui的网页应用设计
  • 明源地产ERP系统 WFWebService 反序列化漏洞复现
  • 浔川 AI 翻译 v5.0 已在进行内部测试!— 浔川社团官方联合会
  • (11)(2.1.7) FETtec OneWire ESCs(二)
  • Sigrity SPEED2000 Power Ground Noise Simulation模式如何进行串扰分析操作指导-trace耦合
  • 遗传算法与深度学习实战(23)——利用遗传算法优化深度学习模型
  • Mysql详细知识点(建议收藏)
  • JUC-locks锁
  • Java基础-组件及事件处理(上)
  • AIDL HAL简介
  • Ajax 与 Vue 框架应用点——随笔谈
  • UI自动化测试|XPath元素定位实践
  • 开闭原则(OCP)在SpringBoot系统中的应用
  • 【求阶乘——二分+阶乘的质因数分解】
  • 大数据分析案例-基于XGBoost算法构建电子商务交易欺诈预测模型
  • Servlet的使用
  • 创建逻辑卷报错:Device /dev/sdb excluded by a filter
  • 高考、考研、考公,究竟哪个更容易?网友众说纷纭,真相在这里
  • 通过生成式人工智能绕过面部识别认证
  • 深入理解接口测试:实用指南与最佳实践5.0(二)
  • Java基础-组件及事件处理(中)
  • flutter下拉刷新上拉加载的简单实现方式三
  • 【SSL-RL】自监督强化学习:自预测表征 (SPR)算法