代码随想录算法训练营Day03 | 链表理论基础、203.移除链表元素 、707.设计链表、206.反转链表

news2024/9/22 5:21:48

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 链表理论基础
  • 203.移除链表元素
    • 思路与重点
  • 707.设计链表
    • 思路与重点
  • 206.反转链表
    • 思路与重点

链表理论基础

  • C/C++的定义链表节点方式:
// 单链表
struct ListNode {
    int val;  // 节点上存储的元素
    ListNode *next;  // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}  // 节点的构造函数
};

  • 数组与链表的对比:

203.移除链表元素

  • 题目链接:203. 移除链表元素 - 力扣(LeetCode)
  • 讲解链接:代码随想录 (programmercarl.com)
  • 状态:提交一次后AC。

思路与重点

  • 使用了一个虚拟头节点,指向题目给出的头节点,然后遍历链表开始删除,最后返回虚拟头节点的next指针即可。主要使用C++时不要忘记释放掉被删除节点占用的空间
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummy_head = new ListNode(-1, head);
        ListNode* cur = dummy_head;
        while(cur->next != nullptr){
            if(cur->next->val == val){
                ListNode* temp = cur->next->next;
                delete cur->next;
                cur->next = temp;
            }
            else cur = cur->next;
        }
        head = dummy_head->next;
        delete dummy_head;
        return head;
    }
};
  • 链表的定义具有递归的性质,因此链表题目常可以用递归的方法求解。这道题要求删除链表中所有节点值等于特定值的节点,可以用递归实现。
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 基础情况:空链表
        if (head == nullptr) {
            return nullptr;
        }

        // 递归处理
        if (head->val == val) {
            ListNode* newHead = removeElements(head->next, val);
            delete head;
            return newHead;
        } else {
            head->next = removeElements(head->next, val);
            return head;
        }
    }
};

707.设计链表

  • 题目链接:707. 设计链表 - 力扣(LeetCode)
  • 讲解链接:代码随想录 (programmercarl.com)
  • 状态:直接看题解了。

思路与重点

  • 使用虚拟头结点可以很大降低写代码的复杂程度。
  • 注意LinkedNode* cur = _dummyHead;LinkedNode* cur = _dummyHead->next;
class MyLinkedList {
public:
    struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int val):val(val), next(nullptr){}
    };

    MyLinkedList() {
        _dummyHead = new LinkedNode(0);
        _size = 0;
    }
    
    int get(int index) {
        if(index < 0 || index >= _size){
            return -1;
        }
        LinkedNode* cur = _dummyHead->next;
        while(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) cur = cur->next;
        cur->next = newNode;
        _size++;        
    }
    
    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++; 
    }
    
    void deleteAtIndex(int index) {
        if(index >= 0 && index < _size){
            LinkedNode* cur = _dummyHead;
            while(index--){
                cur = cur->next;
            }
            LinkedNode* temp = cur->next;
            cur->next = cur->next->next;
            delete temp;
            temp = nullptr;
            _size--;
        }  
        else return;
    }

private:
    LinkedNode* _dummyHead;
    int _size;
};

206.反转链表

  • 题目链接:206. 反转链表 - 力扣(LeetCode)
  • 讲解链接:代码随想录 (programmercarl.com)
  • 状态:直接去看卡哥视频了。

思路与重点

  • 用双指针法很好解决,不需要用新的链表分配空间。卡哥的视频讲的是真清晰啊,用以下的动图很好理解。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = head;
        ListNode* pre = nullptr;
        ListNode* temp = nullptr;
        while(cur){
            temp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
};
  • 也可以用递归的方式解决,递归的解决思路其实和双指针法一样。
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        return reverse(nullptr, head);
    }

    ListNode* reverse(ListNode* pre, ListNode* cur){
        if(!cur) return pre;
        ListNode* temp = cur->next;
        cur->next = pre;
        return reverse(cur, temp);
    }
};

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

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

相关文章

vue part 8

浏览器本地存储 application&#xff0c; local storage中 js方法肯定会用很多呀&#xff0c;只是不直接操作dom了但是对对象和数组进行操作还是原先的方法&#xff0c;jq的话想用引入就可以了。我是直接放弃jq了&#xff0c;在框架中用jq包不好 sessionStorage.HTML <!…

Git+word记笔记

程序员记笔记主要同步很重要&#xff0c;我这个方法只支持个人笔记&#xff0c;如果团队还是用企业微信开个企业会员比较方便。为什么用word&#xff0c;因为可以镶嵌代码和文档&#xff0c;不仅仅是文字&#xff0c;兼容性强 语雀&#xff0c;云笔记这些对于上传的word都是有…

AI大模型编写多线程并发框架(六十五):发布和应用

系列文章目录 文章目录 系列文章目录前言一、项目背景二、第十三轮对话-优化传参三、第十四轮对话-释放资源四、完善所有单元测试五、验证通过六、发布七、参考文章 前言 在这个充满技术创新的时代&#xff0c;AI大模型正成为开发者们的新宠。它们可以帮助我们完成从简单的问答…

IA——网络操作设备VRP简介

一&#xff0c;VRP简介 二&#xff0c;网络设备的管理 &#xff08;1&#xff09;console口&#xff1a; &#xff08;2&#xff09;talnet: &#xff08;3&#xff09;SSH: 安全的远程登陆 &#xff08;4&#xff09;通过WEB页面登录&#xff1a; 三&#xff0c;命令行常见…

TikTok养号一般养几天?账号起步方法

TikTok养号是一个关键的步骤&#xff0c;它可以帮助新账号快速积累粉丝和观众&#xff0c;增加视频的曝光和互动率&#xff0c;从而提升账号的影响力和可见性。但是养号也并不是简单的登录账号、互动点赞&#xff0c;而是从底层设备到分发频率都需要讲究方法&#xff0c;否则号…

linux下c语言中的单向列表,双向链表,内核双向列表,及适用场景

1. 单向链表&#xff08;Singly Linked List&#xff09; 1.1 定义与结构 单向链表是链式存储结构中最简单的一种。它的每个节点包含两个部分&#xff1a; - 数据域&#xff1a;存储数据元素 - 指针域&#xff1a;存储指向下一个节点的指针 在单向链表中&#xff0c;节点通过…

OpenHarmony实战开发:@Watch装饰器:状态变量更改通知

往期鸿蒙全套实战精彩文章必看内容&#xff1a; 鸿蒙开发核心知识点&#xff0c;看这篇文章就够了 最新版&#xff01;鸿蒙HarmonyOS Next应用开发实战学习路线 鸿蒙HarmonyOS NEXT开发技术最全学习路线指南 鸿蒙应用开发实战项目&#xff0c;看这一篇文章就够了&#xff08…

为什么要做智慧厕所,智慧公厕的建设意义有哪些?@卓振思众

智慧厕所是利用物联网、大数据、人工智能等技术&#xff0c;对传统厕所进行智能化升级改造后的新型厕所。它具备环境监测与调控、厕位引导、资源管理、安全管理、数据分析与管理平台等功能和特点。卓振思众是智慧厕所源头厂家&#xff0c;建设智慧厕所主要有以下几个重要原因&a…

【python因果推断库7】使用 pymc 模型的工具变量建模 (IV)2

目录 与普通最小二乘法 (OLS) 的比较 应用理论&#xff1a;政治制度与GDP 拟合模型&#xff1a;贝叶斯方法 多变量结果和相关性度量 结论 与普通最小二乘法 (OLS) 的比较 simple_ols_reg sk_lin_reg().fit(X.reshape(-1, 1), y)print("Intercept:", simple_ols_…

V90总线伺服报800F错误

1、博途PLC工艺对象位置轴轴控功能块 博途PLC工艺对象位置轴轴控功能块(完整SCL代码)-CSDN博客文章浏览阅读423次。S7-1200PLC脉冲轴位置轴位置控制功能块S7-1200PLC脉冲轴位置轴位置控制功能块优化(完整SCL源代码)_s71200 脉冲轴-CSDN博客文章浏览阅读341次。该博客详细介绍了…

自闭症儿童语言干预

自闭症儿童的语言发展往往面临独特挑战&#xff0c;这不仅影响了他们的日常交流能力&#xff0c;也制约了其社交与认知的全面发展。因此&#xff0c;实施科学有效的语言干预对于促进自闭症儿童的语言能力至关重要。 语言干预应基于个性化原则&#xff0c;充分考虑每个孩子的兴…

基于echarts车辆大数据综合分析平台

0.序言 基于ECharts的大数据综合分析平台技术框架与基本原理 技术框架 基于ECharts的大数据综合分析平台是一个集数据收集、处理、分析及可视化展示于一体的综合性系统。其技术框架主要可以分为以下几个层次&#xff1a; 数据源层&#xff1a; 数据收集&#xff1a;通过各种…

STM32F407ZET6

GPIO SPI 串行外设接口(Serial Peripheral Interface)的简称也叫做SPI,是一种高速的、全双工同步通信的一种接口,串行外设接口一般是需要4根线来进行通信(NSS、MISO、MOSI、SCK),但是如果打算实现单向通信(最少3根线,NSS、MOSI、SCK),就可以利用这种机制实现一对多或…

八、发票校验(1)

第一节 发票知识 1、发票介绍 发票是指一切单位和个人在购销商品、提供或接受服务以及从事其他经营活动中&#xff0c;所开具和收取的业务凭证&#xff0c;是会计核算的原始依据&#xff0c;也是审计机关、税务机关执法检查的重要依据。 发票必须具备的要素是根据议定条件由…

Xilinx系FPGA学习笔记(四)VIO、ISSP(Altera)及串口学习

系列文章目录 文章目录 系列文章目录VIO&#xff08;Vivado&#xff09;ISSP&#xff08;Altera&#xff09;串口学习FPGA串口发送FPGA串口接收 VIO&#xff08;Vivado&#xff09; VIO 的全称叫 Virtual Input/Output&#xff0c;建立一个虚拟的输入/输出信号&#xff0c;可以…

CRE6959AM70V055S 超低待机功耗反激式开关电源芯片

CRE6959AM70V055S 是一款高度集成的电流型 PWM控制 IC&#xff0c;为高性能、低待机功率、低成本、高效率的隔离型反激式开关电源控制器。在满载时&#xff0c;CRE6959AM70V055S工作在固定频率(65kHz)模式。在负载较低时&#xff0c;CRE6959AM70V055S采用节能模式&#xff0c;实…

前端XSS 攻击与SQL注入 处理

前端XSS 攻击与SQL注入 处理 文章目录 前端XSS 攻击与SQL注入 处理 一、XSS 攻击与SQL注入是什么二、XSS 攻击与SQL注入包含哪些方式1. XSS 攻击方式2. SQL 注入方式 三、如何避免XSS 攻击与SQL注入1. 避免XSS 攻击2. 避免SQL 注入 四、扩展与高级技巧1. XSS 防御策略2. SQL 注…

代码随想录算法训练营第32天 动态规划part01| 题目:理论基础 、 509. 斐波那契数 、70. 爬楼梯 、 746. 使用最小花费爬楼梯

代码随想录算法训练营第32天 动态规划part01| 题目&#xff1a;理论基础 、 509. 斐波那契数 、70. 爬楼梯 、 746. 使用最小花费爬楼梯 文章来源&#xff1a;代码随想录 理论 题目名称&#xff1a;509. 斐波那契数 斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的…

【论文分享】GPU Memory Exploitation for Fun and Profit 24‘USENIX

目录 AbstractIntroductionResponsible disclosure BackgroundGPU BasicsGPU architectureGPU virtual memory management GPU Programming and ExecutionGPU programming modelGPU kernelDevice function NVIDIA PTX and SASSSASS instruction encoding GPU Memory SpacesGlob…

react购物车Redux

入口index.js import React from react import {createRoot} from react-dom/clientimport App from ./App //注入store import {Provider} from "react-redux"; import store from "./store";const root createRoot(document.getElementById(root)) roo…