反转链表+交换两个链表的节点

news2024/11/19 7:34:41

目录

​编辑

一,反转链表

1.题目描述

2.例子

3.题目接口

 4.分析以及解题代码

1.迭代法

2.递归写法

二,两两交换两个链表中的节点

1.题目描述

2.例子

3.题目接口

4.题目分析以及解法

一,反转链表

1.题目描述

首先来看看反转链表的题目描述:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

2.例子

3.题目接口

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {

    }
};

 4.分析以及解题代码

1.迭代法

迭代法可谓是比较简单并且好理解的方法了。大概的思路便是定义三个指针,pre,cur,next。然后通过这三个指针来调整节点的指向。代码如下:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {

       if(head == nullptr||head->next == nullptr)
       {
           return head;
       }

         ListNode* pre = nullptr;
         ListNode*cur = head;
         ListNode* next = head->next;

         while(cur)//不断迭代
         {
             cur->next = pre;
             pre = cur;
             cur = next;
             if(cur)
             {
                 next = cur->next;
             }
         }
         
         return pre;

    }
};

看起来迭代法不错,代码也挺简洁的。但是这道题其实还可以用递归来解决,用递归写出来的代码会更加简洁。但是递归写法的代码通常会比较难以理解。

2.递归写法

反转链表这个大任务的实现卡其实是有赖于许多个小任务的实现来完成的,这些小任务的操作又是重复的。所以在这里便会出现重复的子问题,有重复的子问题便有递归的解决方法。

      1.重复的子问题:如以上例子,要反转的链表是一个带有五个节点的链表。要反转这五个节点首先就得后面四个节点,要反转后面四个链表就得反转后面的两个节点。

     2.递归出口:在反转链表时,如果遇到空节点或者是只有一个节点时就不用反转了。这时直接返回头节点便是了。

     3.函数体书写:函数体的书写其实是针对一个子问题来解决的。就比如最小的两个节点,要反转链表便是让头结点的下一位节点的next指向头节点,而让头节点的next指向nullptr。并且要保存最后一个节点并一层一层的返回。

所以递归代码书写如下:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head == nullptr||head->next == nullptr)
        {
            return head;
        }
        
         ListNode* newhead = reverseList(head->next);//保存最后一个节点

         head->next->next = head;//从最后的两个链表开始不断地从后往前反转链表
         head->next = nullptr;

         return newhead;//返回的一直都是最后一个节点

    }
};

递归的代码虽然有点难以理解但是还是特别神奇的。

二,两两交换两个链表中的节点

1.题目描述

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

2.例子

3.题目接口

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {

    }
};

4.题目分析以及解法

首先,题目要求的是两两交换节点,所以这个题目的节点的总数就是偶数。所以我们可以大胆的将大问题转换成重复的子问题。

1.子问题就是两个两个为一组交换节点。

2.递归的结束条件就是当传入的节点只有一个或者节点为nullptr时便返回到上层。

3.函数体的书写就要靠函数的实现逻辑了。首先,和反转链表一样得保存上一层的节点。但是这个节点在每一层都会改变成不同的节点。然后便是反转每一层两个节点的指向。然后保存头节点。返回。

代码如下:

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head == nullptr||head->next == nullptr)
        {
            return head;
        }

          ListNode* tmp = swapPairs(head->next->next);//递归回来的一层的头节点
          ListNode* ret = head->next;//这一层的头节点
          //反转链表的操作
          head->next->next = head;
          head->next = tmp;

          return ret;//返回这一层的头节点


    }
};

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

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

相关文章

主流深度学习框架及神经网络模型汇总

目录 主流深度学习框架及神经网络模型汇总 一、人工智能的研究领域和分支 二、主流深度学习框架​编辑 1.TensorFlow 2.PyTorch 3.PaddlePaddle 4.Keras 5.Caffe/Caffe2 6.MXNet 7.Theano 8.Torch 9.CNTK 10.ONNX 三、深度学习移动端推理框架 1.TensorRT 2.TF-…

LabVIEW是如何控制硬件的?

概述 工程 师 和 科学 家 可以 使用 LabVIEW 与 数千 种 不同 的 硬件 设备 无缝 集成, 并 通过 方便 的 功能 和 跨 所有 硬件 的 一致 编 程 框架 帮助 节省 开发 时间。 内容 通过更简单的系统集成节省开发时间 连接到任何硬件 NI 硬件 第三方硬件 快速找到…

数据库事务四大特性

事务的4大特性(ACID): 原子性(Atomicity): 事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。 一致性(Consistemcy): 事务前后,数据库的状态都满足所有的完…

Python之defaultdict方法详解

文章目录 字典dict介绍collections.defaultdict类 字典dict介绍 python中的dict是一个重要的数据类型,用“键”(key)来索引,表示为dict(key: val, …),有以下特征: 键可以是任何不可变(immutable)数据类型不可变数据类型有:数字&#xff0c…

嵌入式软件设计

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

手写数字识别之损失函数

目录 交叉熵 手写数字识别之损失函数 分类任务的损失函数 Softmax函数 交叉熵的简单理解:真实分布与非真实分布的交叉,完全对应,熵为0 交叉熵的代码实现 交叉熵 给定一个策略, 交叉熵就是在该策略下猜中颜色所需要的问题的期望值。更普…

三、JVM监控及诊断工具-GUI篇

目录 一、工具概述二、jconsole(了解即可)1、基本概述2、启动3、三种连接方式4、作用 三、Visual VM 一、工具概述 二、jconsole(了解即可) 1、基本概述 从Java5开始,在JDK中自带的Java监控和管理控制台用于对JVM中内…

【mindspore学习】环境配置

本次实验搭配的环境是 CUDA 11.6 CUDNN v8.9.4 TensorRT-8.4.1.5 mindspore 2.1.0。 1、配置 Nvidia 显卡驱动 如果原来的主机已经安装了 nvidia 驱动,为避免版本的冲突,建议先清除掉旧的 nvidia驱动 sudo apt-get --purge remove nvidia* sudo apt…

土豆叶病害识别(图像连续识别和视频识别)

效果视频:土豆叶病害识别(Python代码,pyTorch框架,视频识别)_哔哩哔哩_bilibili 代码运行要求:Torch库>1.13.1,其它库无版本要求 1..土豆叶数据集主要包好三种类别(Early_Blight…

分布式训练 最小化部署docker swarm + docker-compose落地方案

目录 背景: 前提条件: 一、docker环境初始化配置 1. 安装nvidia-docker2 2. 安装docker-compose工具 3. 获取GPU UUID 4. 修改docker runtime为nvidia,指定机器的UUID 二、docker-swarm 环境安装 1. 初始化swarm管理节点 2. 加入工…

Redis数据类型全总结【万字总结】

文章目录 前言一、String1、内部实现2、应用场景缓存对象常规计数分布式锁共享 Session 信息 3、常用指令 二、List1、内部实现2、应用场景消息队列List 作为消息队列有什么缺陷 3、常用指令 三、Hash1、内部实现2、应用场景缓存对象购物车 3、常用指令 四、Set1、内部实现2、应…

10万字智慧政务大数据平台项目建设方案222页[Word]

导读:原文《10万字智慧政务大数据平台项目建设方案222页[Word]》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 1.1 项目建设目标 推进市一级政府搭建数…

测试.net开源音频库NAudio

微信公众号“dotNET跨平台”看到一篇文章《【.NET】使用NAudio实现录音功能》介绍基于NAudio实现录音功能(参考文献1)。NAudio是开源.net音频库,其支持播放多种格式的音频(WAV、AIFF、MP3、WMA等)、音频格式转换、录音…

lnmp架构-mysql

1.MySQL数据库编译 make完之后是这样的 mysql 初始化 所有这种默认不在系统环境中的路径里 就这样加 这样就可以直接调用 不用输入路径调用 2.初始化 重置密码 3.mysql主从复制 配置master 配置slave 当master 端中还没有插入数据时 在server2 上配slave 此时master 还没进…

【MongoDB系列】-MongoDB详解(一文让你明白什么是MongoDB)

MongoDB简介 MongoDB 是一个开源的、跨平台的、面向文档的、基于分布式文件存储的数据库系统,MongoDB 是由 C 语言开发,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。在高负载的情况下,通过添加更多的节点,可以保证服务器…

基于YOLOV8模型的人脸口罩目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOV8模型的人脸口罩目标检测系统可用于日常生活中检测与定位人脸口罩,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

基于android的学生公寓后勤系统/学生公寓管理系统APP

摘 要 随着网络科技的发展,移动智能终端逐渐走进人们的视线,相关应用越来越广泛,并在人们的日常生活中扮演着越来越重要的角色。因此,关键应用程序的开发成为影响移动智能终端普及的重要因素,设计并开发实用、方便的应…

Git企业开发控制理论和实操-从入门到深入(四)|Git的远程操作|Gitee

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

Dart PowerTCP Emulation for .NET Crack

Dart PowerTCP Emulation for .NET Crack .NET CF上的PowerTCP Emulation为手持设备提供了高级的Internet通信组件。这些功能允许同步操作,这样可以消耗更少的资源,提供更大的灵活性,并生成易于维护的软件。带有.NET的PowerTCP仿真包括VT52、…

阿里云架构

负载均衡slb 分类以及应用场景 负载均衡slb clb 传统的负载均衡(原slb) 支持4层和7层(仅支持对uri(location),域名进行转发) 一般使用slb(clb) alb 应用负载均衡 只支持7层,整合了nginx负载均衡的各种功能,可以根据用户请求头,响应头 如果需要详细处理用户请求(浏…