首页 > 编程语言 >【C】链表算法题2 -- 反转链表

【C】链表算法题2 -- 反转链表

时间:2025-01-19 23:03:56浏览次数:3  
标签:指向 -- 链表 算法 n1 n2 n3 指针

leetcode链接https://leetcode.cn/problems/reverse-linked-list/description/https://leetcode.cn/problems/reverse-linked-list/description/https://leetcode.cn/problems/reverse-linked-list/description/https://leetcode.cn/problems/reverse-linked-list/description/https://leetcode.cn/problems/reverse-linked-list/description/

 看一下题目描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例1

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

示例2

输入:head = []
输出:[]

思路

  这道题有一个特别好但是不太容易想到的方法,那就是双指针法,之前在顺序表的算法题 -- 移除元素中曾用到过此方法,在那道题中是用两个数组的下表src和dst来遍历顺序表,从而达到去掉相同元素的效果,而在反转链表里面我们依然会用到这个方法。

  在这道题中,我们会创建3个指针n1、n2、n3,开始先让n1指向NULL,n2指向首节点,n3指向首节点的下一个节点,然后遍历原链表,每次让n2的next指针指向n1,让n3的next指针指向n2,然后让n1指向n2指向的节点,n2指向n3指向的节点,再让n3指向其next指针指向的节点,直到n2指向了NULL,最后返回n1,这样就可以达到逆置原链表的效果,画图如下:

  我们再来考虑一下特殊情况,如果按照这个逻辑,那么n3是会比n2早走到NULL的位置的,而判断循环停止的条件是以n2为不为NULL为判断条件,而如果n3为NULL的话,再让n3指向n3的next指针指向的节点,就会发生对NULL指针的解引用,会报错,所以需要判断一下n3的值,再让n3改变指向。

代码

typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) 
{
    //如果链表为空,直接返回
    if (head == NULL)
    {
        return head;
    }
    //创建三个指针
    ListNode* n1, *n2, *n3;
    n1 = NULL, n2 = head, n3 = head->next;
    while (n2)
    {
        //反转链表
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if (n3)
            n3 = n3->next;
    }
    return n1;
}

  在这道题目中,我们依然使用了双指针法来解决。双指针法是解算法题中特别重要的一个方法,该方法并不是真的只创建两个指针,而是通过创建变量来遍历并改变顺序表或者链表中的数据,这个变量可能是下标,也可能是指针。请一定要掌握双指针法这种算法思想。

标签:指向,--,链表,算法,n1,n2,n3,指针
From: https://blog.csdn.net/L_0907/article/details/144163209

相关文章

  • 【2024 CSDN博客之星】2024,我在CSDN技术论坛
    目录一、缘起:一本书与一个平台二、分享:记录点滴,沉淀自我![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/daae278d3bbd471985a36ef7541ffec4.png#pic_center=800x300)三、沉淀:整理知识,助力他人四、升华:从代码到人生![在这里插入图片描述](https://i-blog.csdn......
  • java学习总结(五)继承、重载、重写、多态
    一、继承继承:你继承谁你就是谁,继承是一种严格的父子关系(在父类里面抽取的属性和方法一定是所有子类所共有)(Student继承Person,那么Student就是人)//使用继承的好处可以把多个子类中重复的代码抽取到父类中,提高代码的复用性子类可以在父类的基础上,增加其他功能,使子类更强大......
  • 推荐单通道有刷直流电机驱动芯片AT8236
    单通道直流有刷电机驱动芯片AT8236描述应用特点型号选择典型应用原理图管脚列表推荐工作条件atTA=25°C电气特性atTA=25°C,VM=24VH桥控制电流控制死区时间休眠模式过流保护(OCP)过温保护(TSD)欠压锁定保护(UVLO)PCB版图建议典型应用示例描述AT8236是......
  • 矩阵特征值和特征向量的含义到底表示什么
    说人话:什么是特征值、特征向量。给我10分钟,还你一片蓝天我们在找矩阵A的特征值和特征向量的过程,其实就是在探寻什么向量能在矩阵A的变换下只做拉伸和压缩的变换,而不涉及旋转等其他类型的变换而这就是我们在埋头苦算的做的事情。实际上在现实应用中,我们需要对某个向......
  • 「酉矩阵是什么?几种常见的酉矩阵类型」
    0.酉矩阵的定义酉矩阵(UnitaryMatrix)是复数域中的一个重要矩阵类型。如果一个矩阵的逆等于它的共轭转置(Hermitiantranspose),那么这个矩阵被称为酉矩阵。用数学表示如下:U......
  • 常用拉普拉斯变换及其性质和证明
    1.基本函数的拉普拉斯变换原函数f(t)f(t......
  • 聊天也能写程序?10 分钟让 AI 帮你编写出文本格式转换的程序
    聊天也能写程序?10 分钟让 AI 帮你编写出文本格式转换的程序今天,我要和大家分享:只需跟AI聊聊天,10分钟就能搞定文本格式转换的程序!在 家长必看!1小时搞定RAZ英文绘本英文提取! 文章里提到,我通过AI实现语音转文字,但得到的文本格式只有一大段文字。我想要将这......
  • LeetCode栈和队列
    栈和队列LeetCode栈和队列刷题记录基础知识栈线性表,只允许在表的一段进行插入和删除操作,满足先进后出原则栈在python中没有特定的类或库函数,一般通过列表(list)或是collections.deque双端队列来实现liststack=[]stack.append(1)#压栈stack.append(2)print(st......
  • C转C++最全指南
    1.了解C与C++的关系C++是C语言的超集,意味着所有C语言代码在C++中都有效,但C++引入了更多的特性。C++是面向对象的编程语言,而C语言是过程化编程语言。2.基本语法与数据类型变量声明与初始化:C:inta=10;C++:支持类和对象的构造函数、重载等特性。inta=10;输入输......
  • 【C++】了解stack和queue
    目录stack介绍栈的结构栈接口的使用栈的基本题目最小栈栈的弹出压入序列二叉树的分层遍历栈的模拟实现stack.h文件队列的介绍队列的结构队列接口的使用队列的模拟实现priority_queue的介绍和使用接口使用优先级队列的题目应用数组中第k大的数字优先级队列的......