代码随想录【链表】---->反转链表、两两交换链表中的节点

news2025/1/15 19:37:31

文章目录

  • 206. 反转链表
    • 思路
    • 双指针实现
    • 递归写法
  • 24. 两两交换链表中的节点
    • 思路
    • 代码实现

206. 反转链表

题目LeetCode206. 反转链表
在这里插入图片描述

思路

翻转链表实际上只需要将每一个节点的指针域指向前一个节点即可,原来第一个节点的指针域指向NULL指针
在这里插入图片描述
原头节点是1,翻转后的头节点是5,链表翻转仅仅将链表每一个节点的指针域的指向改变了
具体的翻转过程(纠正:动图中应该先移动pre,再移动cur)
在这里插入图片描述

  • 首先定义了两个指针cur、pre,每次另cur指针指向节点的指针域指向pre指针指向的节点。翻转完一组元素后将pre和cur指针分别向后挪动一个节点
  • 直到cur指针变为NULL指针,此时链表翻转完成,pre变为头结点指针,return pre

注意:

  • pre指针一开始应该是NULL,为了让第一个节点的指针域指向NULL指针
  • cur指针指向下一个节点时应该先将下一个节点的地址保存起来,因为cur指向的节点即进行翻转

接下来就是代码实现了,下面介绍双指针和递归两种代码实现,一定要在理解了双指针的基础上再去理解递归,因为递归代码比较简短、晦涩难懂,但是核心思路和双指针版本是一模一样的


双指针实现

//双指针
struct ListNode* reverseList(struct ListNode* head){
    typedef struct ListNode ListNode;
   ListNode* cur = head;
   //pre指针为NULL是为了让第一个节点翻转为尾节点
   ListNode* pre = NULL;
   //cur为NULL时结束循环,pre为翻转后的头节点
   while (cur)
   {
       ListNode* tmp = cur->next;//将当前节点的下一个节点存起来
       cur->next = pre;//反转节点
       pre = cur;//pre指针指向下一个节点
       cur = tmp;//cur指针之下下一个节点
   }
   //返回新的头节点
   return pre;
}

在这里插入图片描述


递归写法

//递归写法
 typedef struct ListNode ListNode;
ListNode* reverse(ListNode* pre, ListNode* cur)
{
    /*
    while (cur)
    return pre
    这个步骤等价于下面*/
    if (cur == NULL)    return pre;
    //反转
    ListNode* tmp = cur->next;
    cur->next = pre;
    /*
    pre = cur;
    cur = tmp;
    这个步骤等价于下面*/
    return reverse(cur, tmp);
}
 struct ListNode* reverseList(struct ListNode* head){
    
     return reverse(NULL, head);
 }

在这里插入图片描述

递归写法中的reverse函数是将cur指向节点的指针域指向pre指向的节点,所以每次翻转完一个元素后,需要接着翻转下一个元素直到翻转完整个链表。翻转下一个元素直接将cur作为形参传给pre,将tmp(翻转前cur的下一个节点)传给cur


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

题目LeetCode24. 两两交换链表中的节点
在这里插入图片描述

思路

PS:个人认为如果一个题目会改变头节点的地址,那么这道题可以使用虚拟头节点的方式来完成,因为通过虚拟头节点我们最终只需要返回虚拟头节点的指针域,不需要在意修改链表后的头节点地址
这道题将链表两两节点交换,所以原先的头节点一定会成为修改后链表的中间节点,而原先的中间节点最后一定会成为新链表的头节点,所以对这道题而言头节点的地址改变了,所以可以使用虚拟头节点

现在我们来看一下具体过程

  1. 交换前两个节点
    在这里插入图片描述
    交换后链表变成这个样子
    在这里插入图片描述
  2. 继续交换后面的元素,让cur指向先前cur的后两个节点,重复过程1
  3. 直到cur->next(偶数个节点)或者cur->next->next(奇数个节点)为空时停止循环

注意:

  • 执行步骤二前需要将cur指向的后面一个节点地址存起来为了可以让cur的后面第二个节点指向cur后面第一个节点
  • 执行步骤三需要将cur指向后面的第三个节点地址存起来为了可以让cur后面第一个节点指向cur后面第三个节点

代码实现

struct ListNode* swapPairs(struct ListNode* head){
    typedef struct ListNode ListNode;
    //虚拟头节点的创建
    ListNode* dummyHead = (ListNode*)malloc(sizeof(ListNode));
    dummyHead->next = head;
    ListNode* cur = dummyHead;
    //考虑奇数和偶数个节点
    while (cur->next != NULL && cur->next->next != NULL)
    {
        //将cur后面第1、3个节点的地址存起来
        ListNode* tmp1 = cur->next;
        ListNode* tmp2 = cur->next->next->next;
        //步骤一
        cur->next = cur->next->next;
        //步骤二
        cur->next->next = tmp1;
        //步骤三
        tmp1->next = tmp2;
        //cur移动两位、准备下一位的交换
        cur = cur->next->next;
    }
    return dummyHead->next;
}

在这里插入图片描述

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

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

相关文章

前端的性能对业务数据的影响

性能总论 一切没有 profiling 的性能都是耍流氓。凡是真正有价值的性能优化,必定是从端到端的业务场景建立体系来考虑的。 性能体系的建立可以分成以下几部分: 现状评估和建立指标;技术方案;执行;结果评估和监控。 …

【博学谷学习记录】超强总结,用心分享 | 架构师 Redis学习总结

文章目录1.Redis概述&安装配置安装启动2.Redis的Key的设计规范1、key名设计2、避免bigkey**string字符串类型**hash类型(散列表)list列表类型set集合类型sortedset有序集合类型bitmap位图 类型geo地理位置类型1.Redis概述&安装配置 官网&#x…

SQL SERVER数据库生成数据字典并且导出方法

SQL SERVER数据库生成数据字典并且导出方法打开SQL SERVER 2014找到你所需要建立数据字典的数据库在代码区输入如下SQL语句点击运行,导出或者带标题复制出来打开SQL SERVER 2014找到你所需要建立数据字典的数据库 右键→点击 新建查询 在代码区输入如下SQL语句 S…

椭圆型偏微分方程和格林函数

一、本文先简单地介绍一下Green 函数, 第一部分内容来自于文献 [0]BI-GreenNet: Learning Green’s Functions by Boundary Integral Network [1] Evans, L.C.: Partial Differential Equations. American Mathematical Society, Providence, R.I. (2010) [2]Learn…

Redis数据库的安装和命令使用以及python的调用

Redis 简介 Redis是完全开源免费的,是一个高性能的key-value数据库。 Redis与其他 key- value 缓存产品有以下三个特点: Redis支持数据的持久化,可将内存中的数据保存在磁盘中,重启时再次加载使用。Redis不仅支持简单的key-val…

故障定级和定责

故障管理的第一步是对故障的理解,只有正确地面对故障,我们才能够找到更合理的处理方式。 这便需要做两个工作:一是跟踪线上故障处理和组织故障复盘,二是制定故障定级定责标准,同时有权对故障做出定级和定责。 所以&a…

网上选课系统——管理员子系统的设计与实现

本系统是C/S(客户端/服务器)两层结构。采用C#数据库编程语言。服务器部分是SQL Server2000 关系数据库。客户端分为学生选课子系统和管理员管理子系统,它们通过存于后台数据库的数据产生联系。 无论是学生子系统还是管理员子系统&#xff0c…

Follow My Heart Of Apirl. 2023

This article will tell all my story in my daily file to make some deep memories in my heart for Apirl.2023. The line template: The template will be used as the mark of the storys start. 2023.04.10 Commodity n. 货物、商品、日用品 1. Global commodity prices …

《OpenCV3和Qt5计算机视觉应用开发》学习笔记

Qt Creator中使用opencv 在.pro文件中添加 INCLUDEPATH D:\MajorSoftware\opencv\opencv\build\include LIBS D:\MajorSoftware\opencv\opencv\mingw_build\lib\libopencv_*.a一个插件就是一个简单的库,如.dll,可以在运行时加载和使用插件&#xff…

基于模型预测控制(MPC)的微电网调度优化的研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

7针0.96寸OLED的HAL库代码(硬件SPI/全代码/stm32f1/CubeMX配置/包含有正负浮点数/100%一次点亮)

系列文章链接 HC-SR04超声波模块的使用 编码电机以及双电机驱动 4针 0.96OLED的使用 更多有意思的文章点击“我的主页” --------😐 更多有意思的视频 -----> B站 想要亿只独角兽 --------😐 前言 之前发布了一篇硬件I2C的0.96 OLED驱动代码&#…

全国计算机等级考试——二级JAVA完整大题题库【五十三道】

全国计算机等级考试二级 JAVA 题目内容 编写于2023.04.10 分为40道选择题和3道大题(大题是程序填空类型) 其中选择题只能进去做一次,一旦退出来则不可再进(注意!)。大题可以重复进入,重复做。…

JavaScript【七】JavaScript中的内置顶层函数

文章目录🌟前言🌟内置🌟顶层🌟内置顶层函数🌟 Number()🌟 parseInt()🌟parseFloat()🌟String()🌟Boolean()🌟 isNaN()🌟eval()🌟Numbe…

(详细)《美国节日》:某月的第几个星期几

目录 一、题目描述: 二、思路: 1、给定 年月日,如何知道这天是星期几? 2、已知这个月的第一天是星期几,如何知道第三个星期一是几号? 3、最后一个星期一 三、思路总结 四、代码 一、题目描述&#xf…

机器学习---集成学习报告

1.原理以及举例 1.1原理 集成学习(Ensemble Learning)是一种机器学习策略,它通过结合多个基学习器(base learners)的预测来提高模型的性能。集成学习的目标是创建一个比单个基学习器更准确、更稳定的最终预测模型。这…

力扣---LeetCode面试题17.04.消失的数字

文章目录前言面试题17.04.消失的数字方法一:方法二:异或解析:方法三:总结前言 我有我要赶去的远方,风雨兼程披星戴月 本章的内容是力扣每日随机一题的部分方法的解析 提示:以下是本篇文章正文内容&#xf…

安全防御 --- 恶意代码、防病毒

一、恶意代码 1、按照传播方式分类 (1)病毒 概念:病毒是一种基于硬件和操作系统的程序,具有感染和破坏能力,这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地,它是病毒传播的目的地&#xff0…

2023.04.09 学习周报

文章目录摘要文献阅读1.题目2.摘要3.简介4.本文贡献5.传统方法6.IDLSTM-EC7.实验7.1 数据集7.2 基线7.3 评估指标7.4 实验结果8.结论9.展望MDS降维算法1.基本思想2.优化目标3.数学推导4.算法流程马尔可夫链1.随机过程2.简介3.数学定义4.转移概率矩阵5.状态转移矩阵的稳定性Navi…

Python 访问 PostgreSQL

文章目录一、前言1.1 概述1.2 什么是 Psycopg二、操作 PostgreSQL2.1 连接数据库2.2 异常处理2.3 创建表2.4 INSERT 操作2.5 SELECT 操作2.6 UPDATE 操作2.7 DELETE 操作2.8 事务管理2.9 调用存储函数2.10 批量操作一、前言 1.1 概述 Python 是一种高级、通用的解释型编程语言…

排序算法之希尔排序

📝个人主页:爱吃炫迈 💌系列专栏:数据结构与算法 🧑‍💻座右铭:快给我点赞赞💗 文章目录1. 希尔排序2. 算法思路3. 算法实现4. 算法性能分析💞总结💞1. 希尔排…