【一刷《剑指Offer》】面试题 16:反转链表

力扣对应题目链接:206. 反转链表 - 力扣(LeetCode)

牛客对应题目链接:反转链表_牛客题霸_牛客网 (nowcoder.com)

核心考点 :链表操作,思维缜密程度。

一、《剑指 Offer》内容


二、分析题目

解题思路(有较多解法):
  1. 定义三个指针,整体右移,边移动,边翻转,保证不会断链。
  2. 可以采用头插思想进行翻转。
  3. 递归递归版本稍微复杂一些,其关键在于反向工作。假设链表的其余部分已经被反转,现在应该如何反转它前面的部分?

    假设链表为:n_1→…→n_k−1→n_k→n_k+1→…→n_m→∅

    若从节点 n_k+1 到 n_m 已经被反转,而我们正处于 n_k 。

    n_1→…→n_k−1→n_k→n_k+1←…←n_m
    我们希望 n_k+1 的下一个节点指向 n_k。

    所以,n_k->next->next=n_k。

    需要注意的是 n_1 的下一个节点必须指向 ∅。如果忽略了这一点,链表中可能会产生环。


三、代码

1、方法一(三指针)

//牛客AC代码
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* ReverseList(ListNode* head) {
        if(head==nullptr || head->next==nullptr)
            return head;
        ListNode* left=head;
        ListNode* mid=head->next;
        ListNode* right=mid->next;
        while(right)
        {
            mid->next=left;
            left=mid;
            mid=right;
            right=right->next;
        }
        mid->next=left;
        head->next=nullptr;
        head=mid;
        return head;
    }
};

//力扣AC代码
/**
 * 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) {
        ListNode* cur=head;
        ListNode* prev=nullptr;
        while(cur)
        {
            ListNode* tmp=cur->next;
            cur->next=prev;
            prev=cur;
            cur=tmp;
        }
        return prev;
    }
};

2、方法二(插入)

//牛客AC代码
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* ReverseList(ListNode* head) {
        if(head==nullptr || head->next==nullptr)
            return head;
        ListNode* newHead=nullptr;
        while(head)
        {
            ListNode* p=head;
            head=head->next;
            p->next=newHead;
            newHead=p;
        }
        return newHead;
    }
};

//力扣AC代码
/**
 * 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) {
        if(head==nullptr || head->next==nullptr) return head;
        ListNode* newHead=nullptr;
        while(head)
        {
            ListNode* p=head;
            head=head->next;
            p->next=newHead;
            newHead=p;
        }
        return newHead;
    }
};

3、扩展:方法三(递归) 

//力扣AC代码(推荐:写法一)
/**
 * 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) {
        if(head==nullptr || head->next==nullptr) return head;
        ListNode* newHead=reverseList(head->next);
        head->next->next=head;
        head->next=nullptr;
        return newHead;
    }
};

//力扣AC代码(写法二)
/**
 * 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* reverse(ListNode* prev, ListNode* cur)
    {
        if(cur==nullptr) return prev;
        ListNode* tmp=cur->next;
        cur->next=prev;
        return reverse(cur, tmp);
    }
    ListNode* reverseList(ListNode* head) {
        return reverse(nullptr, head);
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动态规划——路径问题:LCR 166.珠宝的最高价值

文章目录 题目描述算法原理1.状态表示(题目经验)2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现CJava 题目描述 题目链接:LCR 166.珠宝的最高价值 算法原理 1.状态表示(题目经验) 对于这种路径类的问题&…

pytest教程-39-钩子函数-pytest_runtest_setup

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest_runtest_protocol钩子函数的使用方法,本小节我们讲解一下pytest_runtest_setup钩子函数的使用方法。 pytest_runtest_setup 钩子函数在每个测试用例的 setup 阶段被调用。这…

43.WEB渗透测试-信息收集-域名、指纹收集(5)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:42.WEB渗透测试-信息收集-域名、指纹收集(4) web-架构资产收集&a…

手动配置dns后网速变慢

之前因为自动的dns能上qq但打不开网页,就手动设置了一个,结果近些天时不时出现网页图片加载慢的问题,影响到我看美女图片了,是可忍熟不可忍 测了下网速,很快,下载上传都是三位数的,那显然不是网…

文本转图表的AI工具-Chart-GPT

Chart-GPT Chart-GPT一款基于 GPT 实现的开源工具,可在几秒内,将文本快速转换为各种图表。用户只需在输入字段中输入数据说明和所需的图表类型,Chart-GPT的后台生成器即可建出多种类型的图表,包括条形图、折线图、组合图、散点图、…

19.删除链表的倒数第n个结点

刷算法题: 第一遍:1.看5分钟,没思路看题解 2.通过题解改进自己的解法,并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步,下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…

书生·浦语大模型实战营之 OpenCompass大模型评测

书生浦语大模型实战营之 OpenCompass :是骡子是马,拉出来溜溜 为什么要研究大模型的评测? 百家争鸣,百花齐放。 首先,研究评测对于我们全面了解大型语言模型的优势和限制至关重要。尽管许多研究表明大型语言模型在多…

Material Studio 计算分子静电力、电荷密度以及差分电荷密度

1.先打开Material Studio导入要计算的分子cif文件或者mol文件,直接Flie-Import 2.高斯几何优化一下结构,参数按照我的设置就行,一般通用,后面出问题再调整 3.点完Run后会跳出很多计算过程,不用管,等他计算完…

类加载器ClassLoad-jdk1.8

类加载器ClassLoad-jdk1.8 1. 类加载器的作用2. 类加载器的种类(JDK8)3. jvm内置类加载器如何搜索加载类--双亲委派模型4. 如何打破双亲委派模型--自定义类加载器5. 自定义一个类加载器5.1 为什么需要自定义类加载器5.2 自定义一个类加载器 6. java代码加…

面试集中营—JVM篇

一、JVM内存模型 线程独占:栈,本地方法栈,程序计数器; 线程共享:堆,方法区 虚拟机栈:线程私有的,线程执行方法是会创建一个栈阵,用来存储局部变量表,操作栈,…

echarts学习笔记:柱状图+雷达图+双环形图+地图可视化+数据传递关系图+关键词条图+数据总览图+AntV/G2/DataV

GitHub - lgd8981289/imooc-visualization: https://www.bilibili.com/video/BV1yu411E7cm/?vd_source391a8dc379e0da60c77490e3221f097a 课程源码 国内echarts镜像站:ISQQW.COM x ECharts 文档(国内同步镜像) - 配置项 echarts图表集&…

《QT实用小工具·五十三》会跑走的按钮

1、概述 源码放在文章末尾 该项目实现了会逃跑的按钮: 两个按钮,一个为普通按钮,另一个为会跑走的按钮 鼠标移到上面时,立刻跑掉 针对鼠标、键盘、触屏进行优化 随机交换两个按钮的文字、偶尔钻到另一个按钮下面、鼠标移开自…

node.js中path模块-路径处理,语法讲解

node中的path 模块是node.js的基础语法,实际开发中,我们通过使用 path 模块来得到绝对路径,避免因为相对路径带来的找不到资源的问题。 具体来说:Node.js 执行 JS 代码时,代码中的路径都是以终端所在文件夹出发查找相…

成人职场英语口语柯桥外语培训之Big deal不是“大事”!别再翻译错啦!

关于deal, 其实有很多容易被人误解的表达, 小编今天就来给大家一一盘点~ 1, deal n. deal 作名词的时候意思是“交易;买卖”。 ❖ She got a new car for $1000! That was really a good deal! 她一千美金买了辆车!真是158575…

Xshell生成ssh密钥及使用

目录 1. 概述2. 环境3. 步骤3.1 生成密钥3.2 部署密钥3.3 使用密钥 1. 概述 使用Xshell软件生成ssh秘钥,正常连接服务器。 2. 环境 Xshell 6 3. 步骤 3.1 生成密钥 1. 打开Xshell --> 工具 --> 新建用户密钥生成向导 2. 选择密钥类型,建议…

2024.1.1 IntelliJ IDEA 使用记录

2024.1.1 IntelliJ IDEA 使用记录 下载设置文件编码maven 配置 插件可以中文语言包安装lombok 插件Smart Tomcat ( 根据需要安装)Smart Tomcat 配置 项目导入java 设置maven 配置 项目运行SpringBoot 项目运行tomcat 运行 (根据需要)相关依赖添加运行配置 下载 IntelliJ IDEA …

【智能优化算法】金枪鱼群优化(Tuna Swarm Optimization,TSO)

金枪鱼群优化(Tuna Swarm Optimization,TSO)是期刊“Computational Intelligence and Neuroscience”(IF:1.8)的2021年智能优化算法 01.引言 金枪鱼群优化(Tuna Swarm Optimization,TSO)的主要…

贪吃蛇小游戏(c语言)

1.效果展示 屏幕录制 2024-04-28 205129 2.基本功能 • 贪吃蛇地图绘制 • 蛇吃食物的功能 (上、下、左、右方键控制蛇的动作) • 蛇撞墙死亡 • 蛇撞自身死亡 • 计算得分 • 蛇身加速、减速 • 暂停游戏 3.技术要点 C语言函数、枚举、结构…

Linux搭建http发布yum源

1、搭建http源yum仓库 (1)在yum仓库服务端安装httpd yum -y install httpd (2)修改配置文件 我们httpd 中默认提供web 界面的位置是我们/var/www/html 目录,如果我们yum 源想指定目录,就需要修改蓝框2处…

【第6节课笔记】LagentAgentLego

Lagent 最中间部分的是LLM,即为大语言模型模块,他可以思考planning和调用什么action,再将其转发给动作执行器action executer执行。 支持的工具如下: Arxiv 搜索 Bing 地图 Google 学术搜索 Google 搜索 交互式 IPython 解释器 IP…