看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题203.707.206翻转链表) 2023.4.21

news2024/10/6 6:42:30

目录

    • 前言
    • 算法题(LeetCode刷题203移除链表元素)—(保姆级别讲解)
    • 算法题(LeetCode刷题707.设计链表)—(保姆级别讲解)
      • 代码参考:
    • 算法题(LeetCode刷题206.反转链表)—(保姆级别讲解)
      • 算法思想(重要):
      • 双指针法代码:
      • 递归法(从前往后翻转指针)代码:
      • 递归法(从后往前翻转指针)代码:
    • 结束语

前言

本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写本文章主要目的在于记录自己学习体会并分享给大家,全篇并不仅仅是复制粘贴,更多的是加入了自己的思考,希望读完此篇文章能真正帮助到您!!!

算法题(LeetCode刷题203移除链表元素)—(保姆级别讲解)

力扣题目链接

在这里插入图片描述
关于这个算法思想,我在之前的文章中已经提过,在这里不再赘述。

链表删除、清空和销毁-----2021-08-30

算法题(LeetCode刷题707.设计链表)—(保姆级别讲解)

力扣题目链接

在这里插入图片描述
关于这个算法思想,我在之前的文章中已经提过,在这里不再赘述。

链表初始化、插入、遍历功能实现----2021-08-17

链表删除、清空和销毁-----2021-08-30

代码参考:

class MyLinkedList {
public:
    // 定义链表节点结构体
    struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int val):val(val), next(nullptr){}
    };

    // 初始化链表
    MyLinkedList() {
        _dummyHead = new LinkedNode(0); // 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
        _size = 0;
    }

    // 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点
    int get(int index) {
        if (index > (_size - 1) || index < 0) {
            return -1;
        }
        LinkedNode* cur = _dummyHead->next;
        while(index--){ // 如果--index 就会陷入死循环
            cur = cur->next;
        }
        return cur->val;
    }

    // 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
    void addAtHead(int val) {
        LinkedNode* newNode = new LinkedNode(val);
        newNode->next = _dummyHead->next;
        _dummyHead->next = newNode;
        _size++;
    }

    // 在链表最后面添加一个节点
    void addAtTail(int val) {
        LinkedNode* newNode = new LinkedNode(val);
        LinkedNode* cur = _dummyHead;
        while(cur->next != nullptr){
            cur = cur->next;
        }
        cur->next = newNode;
        _size++;
    }

    // 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
    // 如果index 等于链表的长度,则说明是新插入的节点为链表的尾结点
    // 如果index大于链表的长度,则返回空
    // 如果index小于0,则在头部插入节点
    void addAtIndex(int index, int val) {

        if(index > _size) return;
        if(index < 0) index = 0;        
        LinkedNode* newNode = new LinkedNode(val);
        LinkedNode* cur = _dummyHead;
        while(index--) {
            cur = cur->next;
        }
        newNode->next = cur->next;
        cur->next = newNode;
        _size++;
    }

    // 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的
    void deleteAtIndex(int index) {
        if (index >= _size || index < 0) {
            return;
        }
        LinkedNode* cur = _dummyHead;
        while(index--) {
            cur = cur ->next;
        }
        LinkedNode* tmp = cur->next;
        cur->next = cur->next->next;
        delete tmp;
        _size--;
    }

    // 打印链表
    void printLinkedList() {
        LinkedNode* cur = _dummyHead;
        while (cur->next != nullptr) {
            cout << cur->next->val << " ";
            cur = cur->next;
        }
        cout << endl;
    }
private:
    int _size;
    LinkedNode* _dummyHead;

};

算法题(LeetCode刷题206.反转链表)—(保姆级别讲解)

力扣题目链接

在这里插入图片描述
在这里插入图片描述

算法思想(重要):

  1. 双指针法
  2. 递归法(从前往后翻转指针)
  3. 递归法(从后往前翻转指针)

双指针法代码:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* temp; // 保存cur的下一个节点
        ListNode* cur = head;
        ListNode* pre = NULL;
        while(cur) {
            temp = cur->next;  // 保存一下 cur的下一个节点,因为接下来要改变cur->next
            cur->next = pre; // 翻转操作
            // 更新pre 和 cur指针
            pre = cur;
            cur = temp;
        }
        return pre;
    }
};

为了更能让大家了解暴力解法的算法思想,作者特意画了一张图供大家观看!!!

在这里插入图片描述
在这里插入图片描述

递归法(从前往后翻转指针)代码:

class Solution {
public:
    ListNode* reverse(ListNode* pre,ListNode* cur){
        if(cur == NULL) return pre;
        ListNode* temp = cur->next;
        cur->next = pre;
        // 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步
        // pre = cur;
        // cur = temp;
        return reverse(cur,temp);
    }
    ListNode* reverseList(ListNode* head) {
        // 和双指针法初始化是一样的逻辑
        // ListNode* cur = head;
        // ListNode* pre = NULL;
        return reverse(NULL, head);
    }

};

//可以和上面的双指针法代码进行对比参考,代码实现原理一样,这里就不再赘述了。

递归法(从后往前翻转指针)代码:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        // 边缘条件判断
        if(head == NULL) return NULL;
        if (head->next == NULL) return head;
        
        // 递归调用,翻转第二个节点开始往后的链表
        ListNode *last = reverseList(head->next);
        // 翻转头节点与第二个节点的指向
        head->next->next = head;
        // 此时的 head 节点为尾节点,next 需要指向 NULL
        head->next = NULL;
        return last;
    }
}; 

为了更能让大家了解暴力解法的算法思想,作者特意画了一张图供大家观看!!!

在这里插入图片描述

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!

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

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

相关文章

DC:5靶机通关详解

信息收集 漏洞发现 扫个目录 发现存在footer.php 查看,发现好像没什么用 参考他人wp得知thankyou.php会包含footer.php 可以通过传参来包含别的文件 但是我们不知道参数,这里用fuzz来跑参数 这里用wfuzz的时候报错了 解决方法如下 卸载 sudo apt --purge remove python3-pycu…

最强省钱攻略——IC设计公司老板必读

2023年&#xff0c;国内半导体产业发展面临着很大的不确定性&#xff0c;这应该是共识。 IC芯片设计公司&#xff0c;重度研发创新导向。 站在企业角度&#xff0c;怎么在不确定性下&#xff0c;组织人、财、物&#xff0c;面向未来&#xff0c;应对市场竞争&#xff1f; 算…

vCener 配置 vSan 网络

文章目录 1. 准备2. 创建vsan网络2.1 创建 vSphere Distributed Switch &#xff08;vds&#xff09;2.2 添加管理主机2.3 添加 networking 3. 删除3.1 删除 vmkernel adapter3.2 删除 hosts3.3 删除 DSwitch 1. 准备 三台物理机搭建 exsi一台部署 vcenter 管理三台 exsi每台物…

扬帆优配|普通股和优先股的区别?普通股和优先股哪个好?

各位投资者或许了解过股票是分为普通股和优先股的&#xff0c;但对其并不十分了解。那么普通股和优先股有什么区别&#xff1f;普通股和优先股哪个好&#xff1f;扬帆优配也为我们准备了相关内容&#xff0c;以供参考。 普通股和优先股的区别&#xff1f; 普通股和优先股的主要…

2023-04-14 算法面试中常见的查找表问题

2023-04-14 算法面试中常见的查找表问题 1 Set的使用 LeetCode349号问题&#xff1a;两个数组的交集 给定两个数组&#xff0c;编写一个函数来计算它们的交集。示例 1:输入: nums1 [1,2,2,1], nums2 [2,2] 输出: [2] 示例 2:输入: nums1 [4,9,5], nums2 [9,4,9,8,4] 输出:…

直播预告 | 时序数据处理的云端利器:TDengine Cloud 详解与演示

当下&#xff0c;我们正处在一个万物互联的时代&#xff0c;大数据、云原生、AI、5G 等数字技术极大地方便了人们的生活&#xff0c;但智能物联网产生的海量数据却成为众多企业在数据处理上的巨大痛点。从本质来看&#xff0c;这些数据大多是产生自各种设备和传感器的时序数据&…

康耐视Designer,通过VC5与西门子S7-1200 PLCProfinet通讯详细

测试使用软件版本 Designer Version: 2.7 GSD: GSDML-V2.3-Cognex-VC5-20140828STEP 7 Professional V14Network Configurator Version: 3.56测试使用硬件 Cognex Vision Controller VC5CIC-5000Siemens PLC: S7-1200 CPU 1214C DC/DC/RLY1.PLC端设置 1.新建一个项目,添加对应…

没看错!一行python代码就可以帮您获取图片中的文字信息

最近工作中有需求需要用python对图片中的文字进行识别&#xff0c;调研了一下&#xff0c;选择了tesseract&#xff0c; 目前在github上有50.5k个star&#xff01;python可以调用&#xff0c;安装也十分方便&#xff0c;pip install pytesseract 即可。如果没有Pillow 包&…

ERTEC200P-2 PROFINET设备完全开发手册(7-2)

7.2 添加自定义参数 编辑GSDML文件&#xff0c;对于64 bytes DI 进行如下修改&#xff0c;由于一般的IO模块不需要支持PROFIEnergy&#xff0c;去掉PROFIEnergy支持&#xff1b;修改模块ID(ModuleIdentNumber "0x00000080"&#xff09;&#xff1b;子模块ID不变&am…

Linux中的进程优先级

Linux中的进程优先级 目录 Linux中的进程优先级引入1、基本概念2、查看进程3、PRI和NI4、修改进程优先级5、进程切换One more thing 引入 在Linux操作系统中&#xff0c;进程的优先级对于系统的性能和响应时间至关重要。进程的优先级决定了该进程在系统资源分配中所占的比例。…

说PHP不适合做爬虫的人,看这里

文章目录 一、关于PHP爬虫框架—Goutte1.1 什么是Goutte1.2 Goutte的优点1.3 Goutte的安装 二、Goutte的使用2.1 基本用法2.2 获取页面内容2.3 表单提交2.4 AJAX请求2.5 登录并抓取数据 三、15个Goutte爬虫示例3.1 简单示例3.2 获取表格内容3.3 登录并获取数据3.4 处理JavaScri…

遇到Spring事务失效,你该怎么办?

Spring 事务场景失效是一个常见的问题。今天来分析这个问题。 1、事务方法被final、static关键字修饰&#xff0c;方法访问权限不是public Service public class UserService {Autowiredprivate UserDao userDao;// final修饰的事务方法Transactionalpublic final void addUse…

实时分布式低延迟OLAP数据库Apache Pinot探索实操

文章目录 概述定义特性何时使用 部署Local安装快速启动手动设置集群 Docker安装快速启动手动启动集群Docker Compose 实操批导入数据流式导入数据 概述 定义 Apache Pinot 官网地址 https://pinot.apache.org/ 最新版本0.12.1 Apache Pinot 官网文档地址 https://docs.pinot.a…

Vivado如何清理工程,并避免缺失必要的文件?

FPGA开发是一项非常复杂的工作&#xff0c;需要处理大量的代码、约束和仿真文件。在开发过程中&#xff0c;由于文件数量庞大&#xff0c;很容易导致工程变得混乱不堪。Vivado是Xilinx公司推出的一款FPGA开发工具&#xff0c;能够帮助开发人员处理这种复杂性&#xff0c;提高开…

【FPGA-DSP】第七期:Mcode调用

目录 1. 有限状态机设计 1.1 FSM代码编写 1.2 输入序列代码编写 1.3. mcode概念 2. Simulink 2.1. 输入部分 2.2. Mcode模块 2.3. 完整模块 总结 参考博客【R1】&#xff0c;参考视频资料【R2】 设计中经常用到一些控制逻辑&#xff0c;如有限状态机&#xff08;FS…

语音特征参数MFCC提取过程详解

一、MFCC概述 在语音识别&#xff08;SpeechRecognition&#xff09;和话者识别&#xff08;SpeakerRecognition&#xff09;方面&#xff0c;最常用到的语音特征就是梅尔倒谱系数&#xff08;Mel-scaleFrequency Cepstral Coefficients&#xff0c;简称MFCC&#xff09;。根据…

IntelliJ IDEA全新发布v2023.1——全面增强UI体验和性能!

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 I…

javaSwingrsa和aes混合加密文件传输系统

RSA和AES加密混合文件传输系统 环境要求&#xff1a; 1、java1.8 2、socket 3、mysql 4、io流 5、swing 登录界面 客户端登录&#xff1a; 1.用户注册的账号保存到数据库中&#xff0c;用户的密码经过md5后保存到数据库中。 2.用户输入正确的账号和密码可以进入 “ …

Gulp 打包压缩 js 文件到指定目录详细流程(修改文件名与后缀)

主篇 前端 Gulp 详细介绍与案例使用。 打包 index.js 测试内容 js 包内容文件&#xff1a; // 测试属性 export const dzmName dzm export const dzmAge 18// 测试方法 export function dzmFunc (name, age) {return 名字&#xff1a;${name}&#xff0c;年龄&#xff1a;${…

Chat的提问工程师,要上线了你慌不慌?

一、什么是Prompt? (1)Prompt的概念 我们在使用GPT的时候,给GPT发送的消息就是Prompt. 例如,当我们问ChatGPT"WPS是什么软件?"时: 其中,"WPS是什么软件?"这句话就是Prompt. (2)为什么要学习Prompt? Prompt是我们和GPT交流的方式,我们需要让GPT了解…