C++算法练习-day7——707.设计链表

算法巡练day03Leetcode203移除链表元素707设计链表206反转链表 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。, 这才是新的头结点。变量在删除链表节点的过程中发挥着重要的作用,既确保了链表结构的完整性,又避免了潜在的内存泄漏问题。 阅读详情

题目来源:. - 力扣(LeetCode)

题目思路分析

在编程中,链表是一种常见的数据结构,用于存储一系列元素,但与数组不同,链表中的元素在内存中不必连续存储。每个元素(称为节点)包含数据部分和一个指向下一个节点的指针。本题要求我们实现一个自定义的链表类MyLinkedList,支持以下操作:

  1. 获取指定位置的元素:get(int index)方法,根据索引返回链表中的元素值,索引无效时返回-1。
  2. 在头部添加元素:addAtHead(int val)方法,在链表头部插入一个新节点。
  3. 在尾部添加元素:addAtTail(int val)方法,在链表尾部插入一个新节点。
  4. 在指定位置添加元素:addAtIndex(int index, int val)方法,在链表的指定位置插入一个新节点。
  5. 删除指定位置的元素:deleteAtIndex(int index)方法,删除链表中指定位置的节点。

为了高效实现这些操作,我们需要维护一个指向链表头部的指针(head),以及一个记录链表大小的变量(size)。使用虚拟头节点(dummy node)可以简化边界情况的处理,例如当index为0时,我们不需要特殊处理头部插入的情况。

代码实现与注解

实例:

#include <algorithm> // 为了使用std::max  
  
struct ListNode {  
    int val;  
    ListNode *next;  
    ListNode(int x) : val(x), next(nullptr) {}  
};  
  
class MyLinkedList {  
public:  
    MyLinkedList() {  
        this->size = 0;  
        // 使用虚拟头节点简化操作  
        this->head = new ListNode(0);  
    }  
      
    // 获取指定位置的元素值  
    int get(int index) {  
        if (index < 0 || index >= size) {  
            return -1; // 索引无效,返回-1  
        }  
        ListNode *cur = head;  
        for (int i = 0; i <= index; i++) { // 循环到目标位置的后一个节点  
            cur = cur->next;  
        }  
        return cur->val; // 返回目标节点的值  
    }  
      
    // 在头部添加元素  
    void addAtHead(int val) {  
        addAtIndex(0, val);  
    }  
      
    // 在尾部添加元素  
    void addAtTail(int val) {  
        addAtIndex(size, val);  
    }  
      
    // 在指定位置添加元素  
    void addAtIndex(int index, int val) {  
        if (index > size) {  
            return; // 索引超出链表长度,不执行任何操作  
        }  
        index = max(0, index); // 确保索引不小于0  
        size++; // 链表长度加1  
        ListNode *pred = head;  
        for (int i = 0; i < index; i++) {  
            pred = pred->next;  
        }  
        ListNode *add = new ListNode(val);  
        add->next = pred->next; // 新节点的next指向原位置的下一个节点  
        pred->next = add; // 原位置的节点指向新节点  
    }  
      
    // 删除指定位置的元素  
    void deleteAtIndex(int index) {  
        if (index < 0 || index >= size) {  
            return; // 索引无效,不执行任何操作  
        }  
        size--; // 链表长度减1  
        ListNode *pred = head;  
        for (int i = 0; i < index; i++) {  
            pred = pred->next;  
        }  
        ListNode *p = pred->next; // 待删除节点  
        pred->next = pred->next->next; // 跳过待删除节点  
        delete p; // 释放待删除节点的内存  
    }  
  
private:  
    int size; // 链表长度  
    ListNode *head; // 链表头部指针(虚拟头节点)  
};

主函数部分:

int main() {  
    MyLinkedList* obj = new MyLinkedList();  
    obj->addAtHead(1);  
    obj->addAtTail(3);  
    obj->addAtIndex(1, 2); // 链表现在是1->2->3  
    cout << obj->get(1) << endl; // 输出2  
    obj->deleteAtIndex(1); // 删除索引1处的节点,链表现在是1->3  
    cout << obj->get(1) << endl; // 输出3  
    delete obj;  
    return 0;  
}

知识点摘要

  1. 链表的基本概念:链表是一种链式存储结构,由一系列节点组成,每个节点包含数据部分和一个指向下一个节点的指针。
  2. 虚拟头节点:在链表头部添加一个不存储实际数据的虚拟节点,可以简化边界情况的处理。
  3. 动态内存管理:使用new和delete关键字在C++中管理动态内存,确保在不再需要时释放内存,防止内存泄漏。
  4. 时间复杂度分析:get、addAtHead、addAtTail、addAtIndex和deleteAtIndex方法的时间复杂度均为O(n),其中n为链表长度。这是因为这些方法在最坏情况下都需要遍历链表的一部分或全部节点。

通过实现自定义链表,我们不仅加深了对链表的理解,还学会了如何在实际编程中运用这些概念。

铁路场景雷达点云目标识别与追踪系统 本文介绍了一种基于毫米波雷达的铁路货运车站安全监控系统。该系统采用分布式架构,通过多个毫米波雷达节点采集点云数据,经过坐标转换、多雷达融合等处理后,利用机器学习算法实现列车、行人等目标的实时识别与追踪。系统包含数据采集层、处理层、目标识别层、追踪层、预警决策层和可视化层,能够克服传统视频监控受环境影响大的缺点,实现全天候可靠监测。文中详细展示了雷达数据解析和点云预处理的代码实现,包括坐标转换、数据格式解析和体素网格滤波等关键技术。该系统可有效预警铁路场景下的碰撞风险,提升货运车站的安全管理水平。 阅读详情

相关推荐

深度学习优化算法解析(Momentum, RMSProp, Adam)

之前看了很多人介绍网络的优化器optimizer,无奈很多都把简单的东西讲的复杂化了,不容易让人懂,恰好之前看过吴恩达老师的最新的课程,这里结合老师讲的和个人想法写一下,方便别人同时也为自己以后回顾吧。 深度学习的优化算法主要有GD,SGD,Momentum,RMSProp和Adam算法吧,还有诸如Adagrad算法,不过大同小异,理解了前面几个,后面的也就引刃而解了。GD算法,SGD算法以及m

willduan的博客 12万+

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

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

m0_55763458的博客 1130

云架构师进阶【SAP迁移方案设计】手把手教您玩转SAP上云

一,项目背景介绍 今天又接到了北京某制造企业SAP迁移的场景,先简单说明一下,好好的SAP在运行着为什么要做迁移这类大动作呢?众所周知SAP的ERP是企业的绝对核心系统,尤其对于制造业更是核心的系统,这样一套核心系统还是生产环境在迁移的过程中必然要面临比较大的挑战,如果有任何问题的话,都会对企业的绩效产生很大的影响。 经过跟客户沟通才得知,客户的SAP原来的系统是托管在运营商机房里,近期感染了勒索病毒,导致业务宕机,SAP应用服务器无法启动,仅有的数据库服务器可以运行。基于上述情况公司领导当机立断决定迅

bdsh818的博客 4220

24暑假算法刷题 | Day3 | LeetCode 203. 移除链表元素,707. 设计链表,206. 反转链表

day3 一些链表基础题目

weixin_54468359的博客 852

揭秘Coze图生图隐藏玩法:用Excel批量生成100+电商主图(扣子插件进阶教程)

本文深入解析了如何利用Coze(扣子)的图像生成插件实现电商主图的批量自动化生产。通过将Excel数据源、参数化提示词模板与参考图风格相结合,构建了一套高效的企业级解决方案,能够快速为海量SKU生成风格统一的高质量图片,大幅提升电商运营效率。

theta的博客 433

告别调参烦恼:用Simulink手把手实现自适应模糊PID温度控制(附模型下载)

本文详细介绍了如何使用Simulink实现自适应模糊PID温度控制,解决传统PID调参难题。通过模糊推理引擎动态调整PID参数,系统能自动适应不同工况,显著提升控制精度和响应速度。文章包含完整的建模步骤、参数优化技巧和工业应用扩展,并附赠可下载模型,帮助工程师快速掌握这一智能控制技术。

weixin_30872499的博客 153

【Day3】链表理论基础、203移除链表元素、707设计链表、206反转链表

链表类型、存储方式、定义、操作;203、707、206、while和for循环

weixin_45768644的博客 738

systemView的安装使用

systemView的安装使用

qq_33712422的博客 3974

【LeetCode】day3:203 - 移除链表元素,707 - 设计链表, 206 - 反转链表

另一种思路是递归的实现,将任务分解为:使当前节点指向前一个节点,接着返回以当前节点为头节点翻转转后的新链表头节点。将后续链表看作一个整体,定义函数为返回翻转后的链表的头节点,并使head指向pre,在当前的递归轮次可以视为这个后续链表已调用该函数完成翻转,且翻转后的尾节点已指向cur,使当前cur指向pre即可,如图。给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。输入:head = [1,2,3,4,5]

Liaac的博客 1003

顶会新宠!Gate+Attention创新思路发A会

性能提升:在Places2自然场景和CelebA-HQ人脸数据集上,与以往方法相比,该系统在自由形式掩码修复任务中取得了更高的质量和更低的误差(例如,平均ℓ1误差和ℓ2误差显著降低)。硬件效率提升:Griffin和Hawk在TPU-v3上的训练效率与Transformer相当,且在推理时具有更低的延迟和显著更高的吞吐量。门控卷积:提出了一种新的门控卷积机制,通过学习每个通道在每个空间位置的动态特征选择机制,解决了传统卷积将所有输入像素视为有效像素的问题。

2501_92785035的博客 974

【CloudCompare】Windows源码编译CloudCompare

本文详细介绍了在Windows环境下编译安装CloudCompare V2.12.0的过程。首先配置了PCL 1.14.1、CMake 3.30.6和QT 5.14.2开发环境,使用Visual Studio 2022工具集。然后下载源码并通过CMake进行配置,特别注意勾选PLUGIN_STANDARD_QPCL以支持PCD文件加载。最后在VS2022中编译安装,并指出Debug模式下可能遇到的VTK库后缀问题,需添加CMAKE_DEBUG_POSTFIX变量解决。整个流程涵盖了从环境搭建到最终编译成功的

yijiujiusan的博客 486

Leetcode 刷题练习算法day3

链表是一种通过指针串联在一起的线性结构,单链表中的每一个结点由两部分组成一个数据域,一个指针域(用于存放下一个节点的指针),最后一个结点也就是尾结点指向NULL。双链表多一个前置指针,可以向后查询也可以向前查询,还有循环链表等。其存储方式不像数组是连续分布的,而是散乱的分布。链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。

prime_nums的博客 948

基于jeecgboot3.9.0的项目管理——项目工作台(二)

基于jeecgboot3.9.0的项目管理——项目工作台(二)

宁波阿成的博客 206

代码随想录算法训练营15期 Day 3 | 203.移除链表元素 、707.设计链表 、206.反转链表

这是因为在 C++中,字面常量 0 既可以表示一个整形常量 0,也可以表示无类型指针常量 (void*) 0,但是编译器默认把它看成是一个整形常量 0 (如果把 0 当指针使用,就必须对其进行强转 (void*) 0 )。链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。

m0_47489229的博客 847

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

代码随想录训练营day3|LeetCode 203,LeetCode 707,LeetCode 206

今天主要学习了链表的一系列操作,完成刷题3题,206待补充递归和迭代。今天是训练营第三天,又是深夜敲代码的一天。明天就周末了,明天没课,应该也能多腾点时间出来写题了。加油,坚持打卡的第三天。

qq_44639909的博客 1036

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

代码随想录算法训练营第day3|203.移除链表元素 、 707.设计链表 、206.反转链表

链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链表的入口节点称为链表的头结点也就是head。如图所示:

qq_60513199的博客 863

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

链表节点的定义,很多同学在面试的时候都写不好。这是因为平时在刷leetcode的时候,链表的节点都默认定义好了,直接用就行了,所以同学们都没有注意到链表的节点是如何定义的。// 单链表int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数int val;// 结点的值// 下一个结点// 节点的构造函数(无参)// 节点的构造函数(有一个参数)

qq_40222433的博客 1398

# 代码随想录Day3 链表理论基础|203.移除链表元素|707.设计链表|206.反转链表

示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL。示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]示例 2: 输入:head = [], val = 1 输出:[]你可以选择使用单链表或者双链表,设计并实现自己的链表。题意:删除链表中等于给定值 val 的所有节点。单链表:指针域只能指向节点的下一个节点。

爱因斯小柚的博客 1118

代码随想录算法训练营第三天 | 203.移除链表元素 707.设计链表 206.反转链表

递归思想很重要,需要多多思考。递归的思想相当考验逻辑能力,递归和循环可以相互实现,使用递归可使代码更简洁,构造递归函数时,对应循环,需要首先考虑循环的初始值,对应递归函数的参数,然后需要考虑循环结束的条件,对应递归的返回值,然后就是一层循环结束以后,第二层循环各个量的关系,对应二次调用递归函数的参数。一定注意Index与cur的关系,Index是第几节点,cur是下标,在有虚拟头节点的时,cur==Index,在没有虚拟头节点时,cur ==Index-1,尤其是在添加节点时,十分容易弄错。

zhang1282882326的博客 2338

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

接下来说一说链表的定义。链表节点的定义,很多同学在面试的时候都写不好。这是因为平时在刷leetcode的时候,链表的节点都默认定义好了,直接用就行了,所以同学们都没有注意到链表的节点是如何定义的。而在面试的时候,一旦要自己手写链表,就写的错漏百出。// 单链表int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数。

Evans857的博客 1072

代码随想录算法训练营day03 203.移除链表元素,707设计链表,206反转链表

链表

weixin_55496975的博客 133

代码随想录C++算法训练,链表篇(day3)

移除链表元素有两种解题,分别为在原链表中操作和设置虚拟头节点再操作,此题解使用后者移除链表考察对链表的基本操作,注意:C++中需要手动释放指针,保护内存返回结果时要注意返回的头节点,不能直接返回head(可能被移除)此题的考点总结:获取链表第index个节点的数值在链表的最前面插入一个节点在链表的最后面插入一个节点在链表第index个节点前面插入一个节点删除链表的第index个节点此题考察对链表的各项基本操作,掌握此题可大大加强对链表操作的理解并锻炼基础能力。

2301_76803938的博客 878

(补)算法训练Day3 | 链表理论基础;LeetCode203. 移除链表元素(虚拟头节点);707.设计链表(链表综合操作);206.反转链表(双指针及其递归写法)

(补)算法训练Day3 | 链表理论基础;LeetCode203. 移除链表元素(虚拟头节点);707.设计链表(链表综合操作);206.反转链表(双指针及其递归写法)

weixin_47284299的博客 548

代码随想录Java算法训练营Day3 | 链表,LeetCode 203.移除链表元素、707.设计链表、206.反转链表

因为leetcode总是帮我们写好了,所以面试有时候干写会不熟悉,所以还是要自己多定义。int val;// 节点的值// 下一个节点// 节点的构造函数(无参)// 节点的构造函数(有一个参数)// 节点的构造函数(有两个参数)

m0_50851715的博客 167

算法训练营|Day3|链表

给你一个链表的头节点head和一个整数val,请你删除链表中所有满足的节点,并返回。

weixin_45199813的博客 810

代码随想录Day3:链表(移除链表元素、设计链表、翻转链表)

注意:这里在定义链表的时候给出了,虽然不写会默认有一个无参构造函数,但是在初始化的时候就无法直接给变量赋值。

m0_73724472的博客 869
上一篇: C++算法练习-day5——59.螺旋矩阵2
下一篇: C++算法练习-day8——206.反转链表
Neophyte0608
博客等级 码龄3年 808粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Neophyte0608

你的鼓励将使我创作学的更加快乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值