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

手把手复现金蝶云星空V8.1文件上传漏洞(附完整POC与修复方案) 本文深度解析金蝶云星空V8.1文件上传漏洞,提供详细的漏洞复现步骤与完整POC,涵盖技术原理、测试环境搭建及验证流程。同时给出多维防护方案,包括官方补丁部署、临时缓解措施和长期安全加固建议,帮助企业有效防范任意文件上传风险。 阅读详情

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

链表

链表的存储在内存中不是连续的
链表的定义
struct ListNode
{
//存储元素
int val;
//下一个节点位置
ListNode* next;
//构造函数
ListNode(int x, ListNode* next):val(x),next(next){}
};
链表节点的删除就和数组不一样了,数组的删除元素相当于覆盖元素,而链表的删除是直接将节点的指向改变,这样通过被删除的节点就不会通过这个链表寻找到,但他仍然存在在链表中,所以需要手动释放。

移除链表元素

文档讲解:代码随想录
视频讲解:手把手带你学会操作链表 | LeetCode:203.移除链表元素
状态:√

  1. 思路
    删除等于val的节点,相当于将指向这个节点的指针改变指向,指向这个节点后面第一个不等于val的节点。
    为了避免第一个节点就是val节点而带来的单独判断,所以采用一个虚拟头结点,即该节点指向原始链表的头部。
    循环终止条件:我们要判断的是当前节点的下一个节点值是否等于val,因为我们在循环中确定了当前节点的值不为val,所以循环终止条件就是val->next!=nullptr
    循环内部的处理逻辑是,当我们发现下一个节点的值为val时,进行删除操作,当不是val时,进行节点移动操作。
    注意由于我们的第一个节点的值可能是val所以,我们最后的返回结果不能是head,虽然我们返回的First->next在定义中是head。
/**
 * 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* removeElements(ListNode* head, int val) {
        //使用虚拟头结点,处理第一个元素就是val的情况
        //用于返回数据
        ListNode* First = new ListNode(0);
        First->next = head;
        //用于处理数据
        ListNode* cur = First;

        //注意循环判断条件
        while(cur->next)
        {
            if(cur->next->val == val)
            {
                //存储要删除的节点
                ListNode* temp = cur->next;
                //改变指向
                cur->next = temp->next;
                //删除该节点
                delete temp;
            }
            //只有当我们next不等于val的时候才进行节点移动,而不是每个循环都要进行节点移动
            else
            {
                cur = cur->next;
            }
            //cout << head;          
        }
        return First->next;
    }
};

时间复杂度:对于每个节点只处理了1次,所以是O(n)

设计链表

文档讲解:代码随想录
视频讲解:帮你把链表操作学个通透!LeetCode:707.设计链表
状态:容易忘记每次增删之后长度要进行变化

  1. 思路
    本题就是对链表的一个模拟,
    1. 首先要定义一个结构体来表示一个节点单元
    2. 其次在类中要定义变量,即头结点和链表长度,在构造函数中初始化
    3. 增加需要定义一个节点用来接收值和处理其指针指向,增加后不要删除,删除节点过程需要定义一个临时变量来存储要删除的节点,使用完之后要删除
    4. 每次增加和删除之后,要记得对长度进行修改
    5. 构造函数中定义的是虚拟头结点,在对链表头部添加元素时效果明显
class MyLinkedList {

public:

    //一个链表节点
    struct ListNode
    {
        int val;
        ListNode* next;
        ListNode(int x):val(x),next(nullptr){}
        ListNode(int x , ListNode* n):val(x),next(n){}
    };

    MyLinkedList() {
        //虚拟头结点
        First = new ListNode(0);
        //此时链表长度
        size = 0;
    }
    
    int get(int index) {
        if(index<0 || index >= size)
        {
            return -1;
        }
        else
        {
            int i = index;
            ListNode* cur = First;
            while(i>=0)
            {
                cur = cur->next;
                i--;
                //cout << cur->val;
            }
            return cur->val;
        }
    }
    //void addAtHead(int val){}
    void addAtHead(int val) {
        ListNode* AddNew = new ListNode(val,First->next);
        First->next = AddNew;
        size++;
    }
    //void addAtTail(int val){}
    void addAtTail(int val) {
        ListNode* cur = First;
        while(cur->next)
        {
            cur = cur->next;
        }
        ListNode* AddNew = new ListNode(val);
        cur->next = AddNew;
        size++;
    }
    //void addAtIndex(int index, int val){}
    void addAtIndex(int index, int val) {
        if(index == size)
        {
            addAtTail(val);
        }
        else if(index > size)
        {
            return;
        }
        else if(index <= 0)
        {
            addAtHead(val);
        }
        else
        {
            ListNode* cur = First;
            int i = index;
            while(i>0)
            {
                cur = cur->next;
                i--;
            }
            ListNode* AddNew = new ListNode(val,cur->next);
            cur->next = AddNew;
            size++;
        }
    }
 //   void deleteAtIndex(int index){}
    void deleteAtIndex(int index) {
        if(index<0 || index >=size)
        {
            return ;
        }
        else
        {
            ListNode* cur = First;
            int i = index;
            while(i> 0)
            {
                cur = cur->next;
                i--;
            }
            ListNode* temp = cur->next;
            cur->next = temp->next;
            delete temp;
            size--;
        }
    }

private:
    ListNode* First;
    int size;
};

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList* obj = new MyLinkedList();
 * int param_1 = obj->get(index);
 * obj->addAtHead(val);
 * obj->addAtTail(val);
 * obj->addAtIndex(index,val);
 * obj->deleteAtIndex(index);
 */

翻转链表

文档讲解: 代码随想录
视频讲解:帮你拿下反转链表 | LeetCode:206.反转链表 | 双指针法 | 递归法
状态:√

  1. 采用虚拟头结点
    虚拟头结点的作用是翻转之后,控制原始的第一个元素指向Null,然后剩下的方法和双指针类似了。直接使用给的头结点返回,再定义一个初始指向头结点下一个节点的指针,通过判断这个指针是否为null,来终止循环。
    这个方法还需要判断初始链表是否为空
/**
 * 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* First = new ListNode(0,head);
       if(head)
       {
       		ListNode* cur = head->next;
       		while(cur)
       		{
       			ListNode* temp = cur->next;
       			cur->next = head;
       			head = cur;
       			cur = temp;
       			temp = nullptr;
       			delete temp;
       		}
       		First->next->next = nullptr;
       }
       return head;
    }
};

temp的定义可以拿到循环外
2. 双指针
直接定义一个返回指针初始为空指针,再定义一个移动判断指针初始为头节点,每次移动利用临时变量存储移动指针的下一个节点,然后改变其的指向,使其指向前一个节点就是返回指针此时所在的位置,之后在进行赋值操作就可以了。
这里要特别注意指针的删除:delete指针只是释放指针的内存空间,而不是指针本身。称为野指针,如果后续进行new一个新的指针,编译器可能会把内存分配到这个指针指向的内存,就出现了两个指针指向同一块内存的操作。所以我们在删除之后,需要将指针变为空指针。在力扣中会出现这样的报错
不过还是最好将temp节点放在循环外定义和删除,节省空间 在这里插入图片描述

/**
 * 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* temp;
        //双指针,一个用于记录已反转的链表,一个记录还未翻转链表的头节点
        ListNode* res = nullptr;
        ListNode* cur = head;
        while(cur)
        {
            ListNode* temp = cur->next;
            cur->next = res;
            res = cur;
            cur = temp;
            temp = nullptr;
            delete temp;
        }
        //delete temp;
        return res;
    }
};
  1. 递归
    感觉任何循环都可以划为递归,同样任何递归可以变为循环
    我们定义一个递归函数,双指针循环中我们实际上有两个参数,res和cur,分别用于存储翻转后的链表和还未翻转的链表的“头结点”,在反转之后将cur赋值给res,将temp赋值给cur所以递归可以这样写
ListNode* reverse(ListNode* res,ListNode* cur)
{
	if(cur == nullptr) return res;
	ListNode* temp = cur->next;
	cur->next = res;
	return reverse(cur,temp);
}
使用Gitlab 搭建私有镜像仓库(外置Nginx) 为了让团队尽快使用Gitlab的CI进行工作,必须做好Gitlab的初始化工作,大家都知道拉取镜像由于某些原因,会比较慢,因此构建自己的私有镜像仓库就成为了关键的一步。当然私有镜像仓库的搭建有很多种方式,这里直接使用Gitlab提供的镜像仓库功能。一揽子解决方案比较香。gitlab真的越来越好用了,有了这个镜像仓,也没必要再使用三方的镜像仓库了。Devops 真好用! 阅读详情

相关推荐

详解APM的开方控制器sqrt_controller

前言 前面说过,sqrt_controller是对P项进行整定用途的,目的就是让P项的控制响应“软”下来,实际上就是一个经过改进的P控制器。读懂了sqrt_controller,那么你对APM的P控制器就了解得差不多了。 仅讨论P控制器,sqrt_controller的作用就是设定一个量linear_dist,以这个量的正负值为分界线划分出一个线性区域范围,在这个范围内表示误差量还很小,遵循Kp*error计算方式输出控制量。 超过linear_dist后,表明误差较大,此时不能由着误差单纯按照线性方式乘以

moumde的博客 4896

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

void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。在插入完成后,新节点会成为链表的第一个节点。给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回。int get(int index) 获取链表中下标为 index 的节点的值。void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。

叽里呱啦大王的博客 845

Vivado 2018.3实战:用IDELAYE3和ISERDESE3搞定高速ADC数据采集(附仿真源码)

本文详细介绍了在Vivado 2018.3中使用Xilinx UltraScale架构的IDELAYE3和ISERDESE3原语实现高速ADC数据采集的实战方法。通过分析5GHz采样系统的时序挑战,提供从PCB布局到Vivado实现的完整解决方案,包括精密时序校准、多相位数据重组及系统级调试技巧,并附赠仿真源码助力工程师快速掌握高速数据采集技术。

weixin_30567225的博客 582

代码随想录刷题训练营Day3--203.移除链表元素 、707.设计链表、206.反转链表

由于一开始的代码基础链表部分花的功夫比较多,很容易就做出来了,只需要将指针指向下下一个元素(忽略下一个元素)就可以了,同时学习了虚拟头节点,删除时链表节点时使用。

一位复制者 666

从原理到调试:一次搞懂Camera Sensor的曝光、增益与帧率三角关系

本文深入解析Camera Sensor中曝光、增益与帧率之间的动态平衡关系,揭示低光环境下帧率下降的根本原因。通过实际调试案例和底层公式分析,帮助开发者理解如何优化相机参数设置,实现画质与流畅度的最佳平衡。

weixin_31310913的博客 429

使用 NTLite 来定制专属的官方 windows 镜像

移除掉不想要的一些自带的应用,比如 Xbox,office 啥的,这个就根据自己的实际需求来选择,备注基本都是有解释这个应用的作用。win 11 的右键展示不喜欢,更喜欢 win10 的,但是需要修改注册表,这里直接把下面的命令写到后期任务里面。NTLite 的自动保存会话功能会保留操作过的配置,是一个 xml 文件,可以在下次升级镜像版本的时候,导入配置。关闭 windows defender,不关会有这个提示,点是,就会跳到对应的界面。勾选创建 iso,配置 iso 镜像的名字,然后点开始。

以梦为马|越骑越傻 3334

代码随想录训练营Day3 LeetCode 203.移除链表元素 LeetCode707.设计链表 LeetCode206.反转链表

(一)注意事项1.定义一个dummy虚拟头结点,指向头节点之前的元素好处:便于返回链表,处理头结点2.定义个cur指针.指向 dummy当我到 cur->next->var==val,cur->next就是要删除元素:删除操作:cur->next =cur->next->next;

ly040422的博客 625

CH7034B显示模块原理图设计,已量产

显示桥接板的价值,不在于简单把 RGB 排线换成另一种接口,而在于能否把并行视频、时钟、显示控制、模拟输出和辅助配置同时组织成稳定系统。当前这张 CH7034B 原理图就是这种思路:U3 CH7034B 作为核心桥接芯片,输入侧是 LCD_R0~R7、LCD_G0~G7、LCD_B0~B7、LCD_DE、LCD_HSYNC、LCD_VSYNC、LCD_CLK 与 LCD_BL,输出侧则通过 DAC0~DAC2 和 DDC_SC/DDC_SD 形成模拟显示接口边界。

不脱发的程序猿 162

代码随想录算法Day3 | 链表基础, 203.移除链表元素, 707.设计链表, 206.反转链表

为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。示例 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。

cestyvwen的博客 1856

R语言线性混合模型(LMM)分析

它将数据表示为固定效应和随机效应的线性组合,其中固定效应表示总体均值的影响,随机效应表示个体间的随机差异。LMM的目标是通过最大似然估计或最小二乘估计来估计模型中的固定效应和随机效应的参数。LMM结合了固定效应和随机效应,能够同时考虑个体间和个体内的变异,并适用于具有相关性的数据。目前在使用LMM的R语言包中,较常用的是lme4和nlme包,它们提供了丰富的函数和工具来拟合和分析线性混合模型。面板数据分析:LMM适用于分析具有面板结构的数据,如经济学中的面板数据或教育研究中的学生评估数据。

走向CTO的路上... 2969

【数据集】全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

WW、forever的博客 388

代码随想录DAY3 203.移除链表元素、707.设计链表、206.反转链表

val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。可以设置一个虚拟头结点,这样原链表的所有节点就都可以按照统一的方式进行移除。单链表:指针域只能指向节点的下一个节点,如上图。

weixin_46620779的博客 3686

【MuJoCo】第一章 仿真环境的搭建与入门

它通过优化的接触动力学算法,能够高效处理复杂的多体交互,这使其成为从机械臂操控到足式机器人运动,再到大规模强化学习训练的理想选择。特别是与 JAX 集成的 MJX 的推出,将高性能仿真的边界推向了新的高度,使得在单台机器上并行数千个仿真环境成为可能。我们将通过编写您的第一个仿真程序,逐步拆解 MuJoCo 的工作流,让您亲手感受物理引擎的脉动。这种加速能力对于需要海量仿真样本的强化学习算法(如 PPO)是颠覆性的,它将原本需要数小时的训练缩短到几分钟。上的几何形状,用于碰撞检测和可视化。

u012133341的博客 368

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

链表:移除元素、设计链表、反转链表

宁愿过拟合不要欠拟合 2133

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

代码随想录算法训练营跟练第三天!!!被链表打脸!!

修炼途中的所见所闻,所思所想。 1397

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

2. 删除head时候 tmp=head,删除cur->next,tmp=cur->next.1.需判断cur以及cur->next是否为空。

qq_24817679的博客 1866

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

方法一:遍历链表跳过值为val的节点,要注意头节点等于val的情况。以指示链表中的上一个节点。假设链表中的所有节点下标从。,请你反转链表,并返回反转后的链表。是指向下一个节点的指针/引用。如果是双向链表,则还需要属性。,请你删除链表中所有满足。给你一个链表的头节点。

m0_74154872的博客 356

代码随想录【day 3链表】| 203.移除链表元素 、707.设计链表 、 206.反转链表

代码随想录【day 3链表】| 203.移除链表元素 、707.设计链表 、 206.反转链表

weixin_43891814的博客 2778

代码随想录day3 203.移除链表元素 707.设计链表 206.反转链表

判断之后我们就需要让current{即目前的指针)指向index 首先定义current=self.dummy_head.next 让current指向除虚拟头结点的第一个链表 然后用for来让current不断后移 for i in range(index) current=current.next 这样current不断后移 一直到指向index 下面是代码实现。让current=dummy_head.next 这时current指向的是头结点 然后用for i in range(index)

qq_39508891的博客 1064

代码随想录【day 3】| 203.移除链表元素、206.反转链表 、 707.设计链表

代码随想训练营

Pittsman的博客 1401

代码随想录算法学习Day3| LeetCode203 移除链表元素、LeetCode707 设计链表、LeetCode206 反转链表

插入和删除都是O(1),查询O(n)。适合数据量不固定,频繁增删,较少查询的场景。

lubbour的博客 1566

代码随想录day3 | 203.移除链表元素 707.设计链表 206.反转链表

反转链表 设计链表 双指针+递归写法

想要上进的coder的博客 1510

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

这里我写addAtIndex时,由于调用了addAtTail方法,导致size加了两次,导致结果错误。这道题在原链表上操作的基础上,需要知道当前节点、前节点和后节点。由于处理头结点是特殊情况,所以使用虚拟头结点。这道题主要理解题意,

m0_68516464的博客 1053

代码随想录Day3 | 203. 移除链表元素,707. 设计链表,206. 反转链表

【链表】203. 移除链表元素,707. 设计链表,206. 反转链表

weixin_43913958的博客 1675

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

数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。链表是通过指针域的指针链接在内存中各个节点。所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。链表的定义性能分析。

weixin_66774683的博客 1716

代码随想录Day3|203.移除链表元素、707.设计链表、206.反转链表

这几天外出比赛没有什么时间coding,这次的题目之前有过用C语言和python写相关代码的经历,用C++写起来除了前期适应面向对象的语法问题之外都还算顺利。

sleepwhite的博客 905

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

代码随想录day3

xccxynb的博客 916
上一篇: 代码随想录Day2| 977.有序数组的平方209.长度最小的子数组 59.螺旋矩阵II
下一篇: 代码随想录Day4 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II
sRiddle
博客等级 码龄7年 528粉丝 63原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值