剑指offer----C语言版----第十八天----面试题24:反转链表

news2025/2/27 7:26:19

目录

1. 反转链表

1.1 题目描述

1.2 思路一:反转指针

 1.3 思路二:头插到新链表

 1.4 往期回顾


1. 反转链表

原题链接:

剑指 Offer 24. 反转链表 - 力扣(LeetCode)icon-default.png?t=MBR7https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof/

1.1 题目描述

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

1.2 思路一:反转指针

看到这道题之后我们会很自然地想到只要将链接节点的指针反转过来,改变原来链表的方向,然后再从头到尾遍历输出到数组即可。

我们可以维护三个指针prev,cur,next,prev初始化为空指针,cur初始化为头结点的指针,next初始化为头结点的下一个节点的指针。

为什么要这么做呢?维护prev的目的是方便反转节点指针后,指向新的节点或者NULL,维护cur的目的就是遍历整个的链表,维护next的目的是方便找到cur的下一个节点,因为一旦反转了指针不用一个指针提前找到cur的下一个节点,就真的找不到下一个节点了!

反转一次之后,把cur给给prev,把next给给cur,next的下一个节点的指针给给next,以此类推直到cur为空指针。我们就完成了反转链表。最后将新的头结点prev赋值给原链表的头结点(见下图)。

//直接反转指针
struct ListNode* reverseList(struct ListNode* head){
    //对输入做合法性判断
    if(head == NULL || head->next == NULL)
    {
        return head;
    }
    //初始化cur,prev
    struct ListNode* cur = head, *prev = NULL;
    while(cur != NULL)
    {
        //逐步反转指针
        struct ListNode* next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    return prev;
}

 1.3 思路二:头插到新链表

 我们可以重新创建一个新的链表,为了方便插入新的节点,我们创建一个带哨兵位的头结点的链表。

我们遍历原来的链表,将每个节点的值头插到我们创建的新的链表中,如此便达到了反转链表的效果。C语言嘛,我们需要自己写一下头插函数,创建新的节点的函数。

创建一个带哨兵位的头节点的链表仅仅是为了方便头插函数的书写,所以当返回结果时,需要返回头结点的下一个节点。

//开辟新节点
struct ListNode* buyNewNode(int x)
{
    struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    //初始化开辟的新节点
    newNode->next = NULL;
    newNode->val = x;
    return newNode;
}

//头插函数
void listPushFront(struct ListNode* head, int x)
{
    //记录下一个节点
    struct ListNode* next = head->next;
    struct ListNode* newNode = buyNewNode(x);
    //连接
    head->next = newNode;
    newNode->next=next;
}

struct ListNode* reverseList(struct ListNode* head)
{
    //对输入做合法性判断
    if(head == NULL || head->next == NULL)
    {
        return head;
    }
    //创建一个带哨兵位的头结点的链表
    struct ListNode* phead = buyNewNode(0);
    //用cur指针遍历原链表,将得到的值头插到新链表
    struct ListNode* cur = head;
    while(cur != NULL)
    {
        listPushFront(phead, cur->val);
        cur = cur->next;
    }
    //返回结果
    return phead->next;
}

 

 1.4 往期回顾

面试题23:链表中环的入口节点

http://t.csdn.cn/QxBYNicon-default.png?t=MBR7http://t.csdn.cn/QxBYN面试题22:链表中的倒数第 k 个节点

http://t.csdn.cn/rQc1xicon-default.png?t=MBR7http://t.csdn.cn/rQc1x

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

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

相关文章

4700. 何以包邮?(简单的dp 01背包思想)

题目如下: 输入样例1: 4 100 20 90 60 60输出样例1: 110样例1解释 购买前两本书 (2090) 即可包邮且花费最小。 输入样例2: 3 30 15 40 30输出样例2: 30样例2解释 仅购买第三本书恰好可以满足包邮条件。 输入样例…

分享128个ASP源码,总有一款适合您

分享128个ASP源码,总有一款适合您 ASP源码 分享128个ASP源码,总有一款适合您 链接:https://pan.baidu.com/s/1FXTm501s200ASY8XYTIk7w?pwd474b 提取码:474b 下面是文件的名字,我放了一些图片,文章里不…

安凯微在科创板IPO过会:计划募资10亿元,小米等为其股东

1月13日,上海证券交易所披露的信息显示,广州安凯微电子股份有限公司(下称“安凯微”)首发符合发行条件、上市条件和信息披露要求,即IPO过会。目前,安凯微的上市申请状态已经变更为“上市委会议通过”。 本次…

线程学习基础(1):单线程爬虫和多线程爬虫的效率比照

线程学习基础:单线程爬虫和多线程爬虫的效率比照1. 并发线程的需求2. 线程提速方法3. 如何选择并发编程的三种方式3.1 什么是CPU密集型计算、IO密集型计算?3.1.1 CPU密集型(CPU-bound)3.1.2 IO密集型(IO-bound)3.2 多线程Thread、…

三维空间中散点平面拟合方法

1、三点求平面方程、平面法向量和点到平面的距离 已知三点p1(x1,y1,z1),p2(x2,y2,z2),p3(x3,y3,z3), 要求确定的平面方程,关键在于求出平面的一个法向量 为此做向量p1p2(x2-x1,y2-y1,z2-z1), p1p3(x3-x1,…

Linux-8 用户管理

Linux-8 用户管理 什么是用户? Linux/Windows通过用户来管理和维护系统; Windows下的管理员用户:AdministratorLinux下的管理员用户:root Windows/Linux都是多用户系统 Windows同一时间只能使用1个用户Linux可以多用户同时登陆&…

STL - Vector容器

基本概念 功能: vector数据结构和数组十分类似,也成为单端数组 vector和普通数组的区别: 不同之处在于数组是静态空间,而vector可以动态扩展 动态扩展: 并不是在原空间后续再接空间&#x…

【pandas】用户手册:10分钟熟悉pandas(下)

数据分组 Splitting : 利用某些条件将数据进行分组Applying : 函数应用于每个单独的分组Combining : 合并最终的结果 df pd.DataFrame({"A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo&q…

【正点原子FPGA连载】第十四章Linux基础外设的使用 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十四章Linux基…

百趣代谢组学文献分享:间歇性禁食调节糖尿病脑损伤多组学研究

百趣代谢组学文献分享,糖尿病已经成为一个全球问题,国际糖尿病联盟(IDF)发布的全球糖尿病地图(第9版)[1]显示,全球糖尿病患者人数不断上升,全球平均增长率为51%,目前有4.…

C#,图像二值化(23)——局部阈值的绍沃拉算法(Sauvola Thresholding)及源程序

1、局部阈值的绍沃拉算法(Sauvola Thresholding)Niblack和Sauvola阈值算法Niblack和Sauvola阈值是局部阈值技术,对于背景不均匀的图像非常有用,尤其是对于文本识别1、2。代替为整个图像计算单个全局阈值,通过使用考虑到…

【5】K8S_Deployment

目录 1、Deployment作用 2、deployment的冗余能力 3、deployment的多副本部署 4、deployment的扩缩容 5、deployment的自愈能力 6、滚动更新 7、版本回退 1、Deployment作用 控制Pod,使Pod拥有多副本,自愈,扩缩容等能力 2、deployme…

【正点原子FPGA连载】第十五章开发环境搭建 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十五章开发环境…

uniapp 窗口小工具、桌面小部件、微件(日历、时间) Ba-AwCalendarS

简介(下载地址) Ba-AwCalendarS 是一款窗口小工具(桌面小部件、微件)插件,默认为简单的时间样式,有其他界面需要,可联系作者定制。 支持定时更新(本插件为每分钟)支持点…

基于springboot,vue二手交易平台

开发工具:IDEA服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7系统用户前台和管理后台两部分,项目采用前后端分离前端技术:vue elementUI服务端技术:springbootmybatis项目功…

【数据结构】开端序幕

写在前面,感同身受初学数据结构,是不是一脸懵,下面你中招了几条?😭怎么全是指针!指针都不会啊!怎么变量名那么长,好难理解啊!什么p,什么next,pp->next究竟…

LeetCode[1753]移除石头的最大得分

难度:中等题目:你正在玩一个单人游戏,面前放置着大小分别为 a、b和 c的 三堆 石子。每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1分。当存在 两个或更多 的空堆时,游戏停止。给你三个整数 a、b和 c…

动手深度学习-多层感知机

目录感知机多层感知机激活函数sigmoid函数tanh函数ReLU函数多层感知机的简洁实现参考教程:https://courses.d2l.ai/zh-v2/ 感知机 模型: 感知机模型就是一个简单的人工神经网络。 感知机是二分类的线性模型,其输入是实例的特征向量&#x…

智慧管廊智能化运维管理平台详情

运维管理平台 ​ 平台主界面完成各分系统情况的全局性展现,用图形界面的方法提升视觉效果感染力,根据图色区分正常、异常情况。 1、自然环境及设备监控 ​ 选用全景分层三维可视化地理信息系统及其多元化的二维在线地图从温度、风速、电力、排水、安防…

windows检测远程主机是否连通或者某个端口是否开启

文章目录一、检测主机是否连通步骤二、测试端口是否打开步骤telnet安装一、检测主机是否连通 ping命令是个使用频率极高的网络诊断工具,在Windows、Unix和Linux系统下均适用。它是TCP/IP协议的一部分,用于确定本地主机是否能与另一台主机交换数据报。根…