力扣: 两两交换链表中的节点

news2024/11/16 23:44:26

文章目录

  • 需求
  • 代码
  • 代码解释
  • 结尾

在这里插入图片描述


需求

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

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

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

示例 2:
输入:head = []
输出:[]

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

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


代码

public ListNode swapPairs(ListNode head) {
    if( head == null || head.next == null ){
        return head;
    }
    ListNode preHead = new ListNode(-1, head);
    ListNode cur = preHead;
    while( cur.next != null && cur.next.next != null ){
        //  拿出前三个元素
        ListNode node1 = cur.next;
        ListNode node2 = node1.next;
        ListNode node3 = node2.next;
        
        //  交换
        node1.next = node3;
        node2.next = node1;
        cur.next = node2;
        //  重置 cur
        cur = node1;
    }
    return preHead.next;
}

代码解释

处理特殊情况:

如果链表为空或者只有一个节点,直接返回 head。因为在这种情况下没有必要进行交换。

if (head == null || head.next == null) {
    return head;
}

初始化虚拟头节点:
ListNode preHead = new ListNode(-1, head);
创建一个虚拟头节点 preHead,它的 next 指向链表的实际头节点 head。这样做可以简化处理链表头部的交换操作。

初始化 cur 指针:

ListNode cur = preHead;
cur 指针用来跟踪当前处理的位置,最初指向 preHead。在交换过程中,cur 负责保持对链表已经交换部分的连接。

交换节点:

while (cur.next != null && cur.next.next != null) {
    //  拿出前三个元素
    ListNode node1 = cur.next;
    ListNode node2 = node1.next;
    ListNode node3 = node2.next;
    
    //  交换
    node1.next = node3;
    node2.next = node1;
    cur.next = node2;
    
    //  重置 cur
    cur = node1;
}

提取三个节点:
node1:当前 cur 节点的下一个节点。
node2:node1 的下一个节点。
node3:node2 的下一个节点。

交换节点:

node1.next = node3:将 node1 的 next 指向 node3(即交换后 node1 之后的节点)。
node2.next = node1:将 node2 的 next 指向 node1(交换节点 2 和节点 1)。
cur.next = node2:将 cur.next 更新为 node2,完成交换后的连接。

更新 cur:

cur = node1:将 cur 指向 node1,为下一对节点的交换做好准备。

返回结果:

return preHead.next;
返回 preHead.next,它指向链表交换后的新头节点。

执行结果:

在这里插入图片描述

结尾

以上 是我对这道算法的一些遐想和延伸, 可能不是最优解, 但是算法的优化嘛 本身就是一个思索的过程, 能在这个思索和迭代的过程中有所收获和乐趣就是在成长了, 欢迎大家一起来交流更多的解答…





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jmeter性能测试之CSV 数据文件设置

文章目录 业务场景使用步骤步骤1&#xff1a;准备数据步骤二: 编写csv文件步骤三:添加CSV 数据文件设置步骤四:定义接口&#xff0c;选择文件上传&#xff0c;文件名称通过“浏览”添加即可 业务场景 有一个文件上传的接口&#xff0c;希望每个线程上传不同的文件&#xff08;比…

FOFA搜索引擎的语法

FOFA 是一款网络空间搜索引擎&#xff0c;允许用户通过自定义查询语法来检索全球范围内的互联网资产。FOFA 提供了丰富的语法&#xff0c;可以帮助用户筛选目标。以下是 FOFA 语法的基本介绍&#xff1a; 1. 基本语法格式 FOFA 的查询语句遵循以下格式&#xff1a; 字段&quo…

MVVM分层思想

M:Model数据模型 V:View视图 VM:ViewModel视图模型 Vue也是借鉴了MVVM的思想 在Vue中,M就是data,V指挂载点,而Vue实例本身就是一个VM <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X…

前端手写源码系列(二)——手写call、apply、bind

手写源码系列目录 一、作用二、手写call方法三、手写apply方法四、手写bind方法五、三者区别applycallbind小结 一、作用 call、apply、bind作用是改变函数执行时的上下文&#xff0c;简而言之就是改变函数运行时的this指向 那么什么情况下需要改变this的指向呢&#xff1f;下…

Spring Boot启用GZIP压缩

1.为什么是需要gzip压缩&#xff1f; 经常我们都会与服务端进行大数据量的文本传输&#xff0c;例如 JSON 就是常见的一种格式。通过 REST API 接口进行 GET 和 POST 请求&#xff0c;可能会有大量的文本格式数据提交、返回。然后对于文本&#xff0c;它有很高的压缩率&#x…

systemserver进程监控者--watchdog

戳蓝字“牛晓伟”关注我哦&#xff01; 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章&#xff0c;技术文章也可以有温度。 本文摘要 本文同样采用自述的方式来介绍systemserver进程的监控者watchdog&#xff0c;通过本文您将了解watchdog的作用&#xff0c;它…

【机器学习】梯度下降算法

梯度下降算法 这篇博客更加详细&#xff0c;以下只是我个人的理解 梯度下降算法原理讲解——机器学习-CSDN博客 梯度下降算法是一种优化算法&#xff0c;通过梯度下降找到函数最小值时的自变量值。 其基本思想是沿着梯度方向的反方向更新参数&#xff0c;直到逼近函数的极值…

【LLM大模型】生成式人工智能大型语言模型的安全性:概述

生成性AI大型语言模型&#xff08;LLMs&#xff09;的安全性&#xff1a;概述 具有生成性AI能力的大型语言模型&#xff08;如ChatGPT&#xff09;正面临加速采用和创新。生成性AI&#xff08;GAI&#xff09;的日益普及不可避免地引发了对这些模型相关风险和安全性的担忧。本…

Linux 下 gdb 的使用

目录 一、概述1、安装和启动 GDB 二、 GDB 常用命令1、查看源码2、断点2.1 设置断点2.2 查看断点信息2.3 删除断点2.4 激活/禁用断点2.5 观察断点2.6 捕获信号2.7 线程中断 3、查看信息3.1 查看数据3.2 查看内存3.3 查看栈信息3.4 查看栈帧信息 4、运行、调试5、编辑和搜索 一、…

MacOS安装 Python 和 PyCharm

MacOS安装 Python3.12.5 和 PyCharm 小阿呜有话说一、MacOS安装PythonPython官网下载 二、MacOS安装PyCharmPyCharm官网下载 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; 小阿呜有话说 …

发完朋友圈就“退款”?黑神话的玩家是否都是“忠实粉丝”?

​声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/2228.html 《黑神话&#xff1a;悟空》自上线以来&#xff0c;便引发了玩家社区的广泛讨论。游戏的退款现象主要受到了一些技术问题和个人体验差异的影响。部分玩家因遇…

容器的ip地址不稳定问题、联合文件系统、核对时间、制作基础镜像

在docker中部署线上考试系统 1、部署前端服务器 # 上传本地下载的dist文件&#xff0c;因为上传的是目录&#xff0c;加-r选项 scp -r D:\云计算\压缩包\项目\dist root192.168.2.50:/root/ # 创建基础容器 [rootdocker ~]# docker run -it --name c0 centos:latest /bi…

SolidityFoundry BitMap

写合约的时候&#xff0c;记录某个账户的bool状态很常见&#xff0c;例如是否领取空投等&#xff0c;传统的写法mapping(uint256>bool)中一个slot只能存储一个账户的信息&#xff0c;在其他语言中&#xff0c;我们经常会用到bitmap来表示标志位&#xff0c;如果我们可以将bi…

银行卡三要素验证如何用Java进行调用

一、什么是银行卡三要素验证&#xff1f; 银行卡三要素验证又叫银行卡三要素核验、银行卡三要素校验、银行卡实名认证、银行卡三元素验证&#xff0c;即输入银行卡卡号、姓名、身份证号码&#xff0c;验证此三要素是否一致&#xff0c;该接口支持所有带银联标识的银行卡。 二…

langchain入门系列之五 初探代理

代理的核心思想是使用LLM来选择要采取的一系列动作。 在链式结构中&#xff0c;一系列动作是硬编码的&#xff08;在代码中&#xff09;。 在代理中&#xff0c;使用语言模型作为推理引擎来确定要采取的动作及其顺序。 代理 这是负责决定下一步采取什么动作的类。 这是由语言…

lidar3607.2 lidar360mls7.2 强大的雷达点云数据处理应用软件

1、LiDAR360是一款强大的激光雷达点云数据处理和分析平台&#xff0c;拥有超过10种先进的点云数据处理算法&#xff0c;可同时处理超过300G点云数据。平台包含丰富的编辑工具和自动航带拼接功能&#xff0c;可为地形、林业、矿山和电力行业&#xff08;参考LiPowerline软件&…

【HarmonyOS 4.0】@BuilderParam 装饰器

1. BuilderParam 装饰器 BuilderParam 装饰器用于装饰自定义组件(struct)中的属性&#xff0c;其装饰的属性可作为一个UI结构的占位符&#xff0c;待创建该组件时&#xff0c;可通过参数为其传入具体的内容。参数必须满足俩个条件&#xff1a; 2.1 参数类型必须是个函数&#x…

前端使用canvas绘制简单工作流-react

效果图如下&#xff1a; 目前只做了绘制部分&#xff0c;绘制方式也比较简单&#xff0c;点击工具栏中需要绘制的图形&#xff0c;在画布上左键点击将会绘制一个图形出来&#xff0c;工具栏选中第一个&#xff0c;再点击其他图像&#xff0c;长按鼠标左键可以移动&#xff0c;删…

丢掉Beyond Compare吧!新款文件差异对比工具WinMerge更具性价比!

今天想和大家分享一款非常实用的免费开源文件比较工具&#xff1a;WinMerge。 作为一名长期从事互联网行业的人&#xff0c;我经常需要处理大量的文档和代码文件&#xff0c;文件对比工具在我的日常工作中可谓是必不可少的“左膀右臂”。 也相信很多朋友在处理多个文档内容或者…

96页PPT集团战略解码会工具与操作流程

德勤集团在战略解码过程中通常会用到以下一些具体工具&#xff1a; 一、平衡计分卡&#xff08;Balanced Scorecard&#xff09; 财务维度&#xff1a; 明确关键财务指标&#xff0c;如营业收入、利润、投资回报率等。你可以通过分析历史财务数据和行业趋势&#xff0c;确定…