代码随想录—力扣算法题:24两两交换链表中的节点.Java版(示例代码与导图详解)

news2025/1/18 17:02:27

版本说明

当前版本号[20230903]。

版本修改说明
20230903初版

24. 两两交换链表中的节点

力扣题目链接
更多内容可点击此处跳转到代码随想录,看原版文件

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

image-20230825162047028

image-20230825162059798

思路

这道题目正常模拟就可以了。

建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。

对虚拟头结点的操作,还不熟悉的话,可以看这篇代码随想录—力扣算法题:203移除链表元素.Java版(示例代码与导图详解)。

接下来就是交换相邻两个元素了,此时一定要画图,不画图,操作多个指针很容易乱,而且要操作的先后顺序

初始时,cur指向虚拟头结点,然后进行如下三步:

image-20230903143157940

操作之后,链表如下:

image-20230903143224878

看这个可能就更直观一些了:

image-20230903143313519

对应代码:

/**
 * swapPairs - 链表两两交换
 * head - 链表的头结点
 * return - 交换后的链表头结点
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dumyhead = new ListNode(-1); // 设置一个虚拟头结点
        dumyhead.next = head; // 将虚拟头结点指向head,这样方便后面做删除操作
        ListNode cur = dumyhead;
        ListNode temp; // 临时节点,保存两个节点后面的节点
        ListNode firstnode; // 临时节点,保存两个节点之中的第一个节点
        ListNode secondnode; // 临时节点,保存两个节点之中的第二个节点
        
        // 当前节点和下一个节点都存在时进行交换
        while (cur.next != null && cur.next.next != null) {
            temp = cur.next.next.next; // 保存当前节点后面的节点
            firstnode = cur.next; // 保存当前节点
            secondnode = cur.next.next; // 保存下一个节点
            
            cur.next = secondnode;       // 步骤一: 将当前节点指向下一个节点
            secondnode.next = firstnode; // 步骤二: 将下一个节点指向当前节点
            firstnode.next = temp;      // 步骤三: 将当前节点指向原来的后续节点
            
            cur = firstnode; // cur移动到当前已经交换完的节点,准备进行下一轮交换
        }
        
        return dumyhead.next;  
    }
}

递归方法

解释:

  1. 首先,判断链表的为空或者只有一个节点,如果满足条件,则无需交换,直接返回头结点。
  2. 否则,我们需要交换两个相邻节点。这里我们可以使用递归的方法,先把第一个节点的下一个节点保存为nextNode
  3. 然后,我们对剩余部分进行递归调用swapPairs(nextNode.next),得到交换后的链表头结点。
  4. 接着,我们将原来的第二个节点的next指针指向原来的第一个节点(即使交换之后的链表的头结点)。
  5. 最后,我们将交换后的第二个节点返回作为新链表的头结点。

通过递归的方式,反复调用swapPairs方法,直到链表的最后一个节点或只剩一个节点时终止递归。最终返回交换后的链表头结点。

请注意,以上代码是基于对问题的理解和分析,但可能不是完整的、可执行的代码。你可以结合实际需求进行代码的调整和完善。

参考代码:

// 递归版本
class Solution {
    /**
     * swapPairs - 链表两两交换节点(递归版本)
     * head - 链表的头结点
     * return - 交换后的链表头结点
     */
    public ListNode swapPairs(ListNode head) {
        // base case 退出提交
        // 如果链表为空或只有一个节点,直接返回头结点
        if(head == null || head.next == null) return head;
        
        // 获取当前节点的下一个节点
        ListNode next = head.next;
        
        // 进行递归
        // 递归调用swapPairs方法,传入next.next作为新的头结点
        ListNode newNode = swapPairs(next.next);
        
        // 这里进行交换
        // 将next节点的next指针指向head,实现两节点交换
        next.next = head;
        // 将head节点的next指针指向递归得到的新头结点newNode
        head.next = newNode;

        // 返回交换后的头结点(原来的第二个节点)
        return next;
    }
}

总结

​ 定义一个Solution类,其中包含了一个swapPairs方法,该方法用于交换给定链表中的每两个相邻节点。代码通过引入一个虚拟头结点dummyhead来简化操作。

​ 在方法体内,建立了一些临时节点,用于保存当前节点、下一个节点和后续节点。然后,通过三个步骤实现交换节点的操作:步骤一将当前节点指向下一个节点,步骤二将下一个节点指向当前节点,步骤三将当前节点指向原来的后续节点。循环遍历链表直到当前节点或下一个节点为空。

ead来简化操作。

​ 在方法体内,建立了一些临时节点,用于保存当前节点、下一个节点和后续节点。然后,通过三个步骤实现交换节点的操作:步骤一将当前节点指向下一个节点,步骤二将下一个节点指向当前节点,步骤三将当前节点指向原来的后续节点。循环遍历链表直到当前节点或下一个节点为空。

​ 最后,返回虚拟头结点的下一个节点作为交换后的链表头结点。

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

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

相关文章

淘宝/天猫获得淘宝商品详情 API 接口文档

item_get-获得淘宝商品详情 API测试工具 注册开通 taobao.item_get 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_sear…

Google colab部署VITS——零门槛快速克隆任意角色声音

目录 序言 查看GPU配置 复制代码库并安装运行环境 选择预训练模型 上传视频链接(单个不应长于20分钟) 自动处理所有上传的数据 训练质量相关:实验发现目前使用CJ模型勾选ADD_AUXILIARY,对于中/日均能训练出最好的效果&#x…

【数据结构】 二叉树面试题讲解->叁

文章目录 🌏引言🌲[根据二叉树创建字符串](https://leetcode.cn/problems/construct-string-from-binary-tree/submissions/)🐱‍👤题目描述:🐱‍🐉示例:📌示例一&#x…

1921. 消灭怪物的最大数量

文章目录 Tag题目来源题目解读解题思路方法一:贪心排序 复杂度分析写在最后 Tag 【贪心】【排序】【数组】 题目来源 1921. 消灭怪物的最大数量 题目解读 dist[i] 是第 i 个怪兽与城市的初始距离,speed[i] 是第 i 个怪兽的移动距离。怪兽的目的是攻击…

Mybatis学习|注解开发、lombok

1.使用注解开发 无需再编写相应的Mapper.xml文件,直接将sql用注解的形式写在Mapper接口的对应方法上即可。 然后因为没有xml文件,所以要在mybatis-config.xml核心配置文件中注册这个Mapper接口,而不用去注册之前的Mapper.xml,这里其实如果用…

04_22 vma(进程下的每个虚拟内存区域查看)对象实战

前言 vma不太懂的可以往前翻 03_008内存映射原理_虚拟内存区域vm_area_struct详解,和mmap系统钓调用及物理内存结构体完全分析 vam 虚拟内存区域 每个进程下有多个vma 这次是查看每个vma的起始地址 结束地址和大小使用 1.进程在用户空间调用mmap也就是上面那个函数。 2.在当前…

一个集成的BurpSuite漏洞探测插件1.2

4、DNSLog查询漏报 注:扫描结束后才会在BurpSuite的Target、Dashboard模块显示高危漏洞,进程扫描中无法进行同步,但可以在插件中查看(涉及到DoPassive方法问题)。

[足式机器人]Part3 变分法Ch01-2 数学预备知识——【读书笔记】

本文仅供学习使用 本文参考: 《变分法基础-第三版》老大中 《变分学讲义》张恭庆 《Calculus of Variations of Optimal Control Theory》-变分法和最优控制论-Daneil Liberzon Ch01-2 数学基础-预备知识1 1.3.2 向量场的通量和散度1.3.3 高斯定理与格林公式 1.3.2 …

js:创建一个基于vite 的React项目

相关文档 Vite 官方中文文档React 中文文档React RouterRedux 中文文档Ant Design 5.0Awesome React 创建vite react项目 pnpm create vite react-app --template react# 根据提示,执行命令 cd react-app pnpm install pnpm run dev项目结构 $ tree -L 1 . ├─…

java基础-----第九篇

系列文章目录 文章目录 系列文章目录前言一、GC如何判断对象可以被回收前言 一、GC如何判断对象可以被回收 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计 数为0时可以回收, 可达性分析法:从 GC Roots 开始向下搜索,搜索所走过的…

SourceTree 使用技巧

参考资料 SourceTree使用教程(一)—克隆、提交、推送SourceTree的软合并、混合合并、强合并区别SourceTree 合并分支上的多个提交,一次性合并分支的多次提交至另一分支,主分支前进时的合并冲突解决 目录 一. 基础设置1.1 用户信息…

mall :hutool项目源码解析

文章目录 一、mall开源项目1.1 来源1.2 项目转移1.3 项目克隆 二、Hutool工具类库2.1 Hutool 简介 三、源码解析3.1 集成与配置3.1.1 导入依赖3.1.2 添加配置 3.2 核心工具类3.2.1 AnnotationUtil使用:注解工具类3.2.2 BeanUtil使用:JavaBean的工具类3.2…

精品基于SpringCloud实现的电影院购票系统设计-微服务-分布式

《[含文档PPT源码等]精品基于SpringCloud实现的电影院购票系统设计的设计与实现-微服务-分布式》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具: 开发语言:Java 框架:springcloud JDK版…

AI:06-基于OpenCV的二维码识别技术的研究

二维码作为一种广泛应用于信息传递和识别的技术,具有识别速度快、容错率高等优点。本文探讨如何利用OpenCV库实现二维码的快速、准确识别,通过多处代码实例展示技术深度。 二维码作为一种矩阵型的条码,广泛应用于各个领域,如商品追溯、移动支付、活动签到等。二维码的快速…

【力扣】416. 分割等和子集 <动态规划、回溯>

【力扣】416. 分割等和子集 给你一个 只包含正整数的非空数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5,…

nmap的使用

目录 nmap简介 主要作用 nmap原理 namp使用 options nmap列举远程机器开放端口 普通扫描 扫描范围端口 对几个端口探测 对所有端口进行探测 指定协议探测端口 扫描对应协议的所有端口 端口状态 nmap识别目标机器上服务的指纹 服务指纹 识别目标机器服务信息 …

Spring 中存取 Bean 的相关注解

目录 一、五大类注解 1、五大类注解存储Bean对象 1.1Controller(控制器储存) 1.2Service(服务存储) 1.3Repository(仓库存储) 1.4Component(组件存储) 1.5Configuration(配置存储) 2、五大类注解小结 2.1为什么要这么多类注解 2.2 五大类注解之间的关系 二、方法注解 1.方法注…

微信小程序编辑器代码格式缩进设置

第一步点击这个编辑器设置: 然后设置tab为空格,并且设置占几个空格,这里是4个空格。 这样就好了,文件保存就会自动设置好缩进格式了。

【Day-27慢就是快】代码随想录-二叉树-二叉树的最小深度

给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 —————————————————————————————————— 1. 递归法 确定单层递归的逻辑: 与最…

3D 碰撞检测

推荐:使用 NSDT场景编辑器快速搭建3D应用场景 轴对齐边界框 与 2D 碰撞检测一样,轴对齐边界框 (AABB) 是确定两个游戏实体是否重叠的最快算法。这包括将游戏实体包装在一个非旋转(因此轴对齐)的框中&#…