【算法-链表1】移除链表元素 和 设计链表

news2024/12/24 2:30:33

今天,带来链表相关算法的讲解。文中不足错漏之处望请斧正!

理论基础点这里


移除链表元素

1. 思路

链表的删除和插入,都是改变链接关系。

在这里插入图片描述

如图:要删除值为2的结点,要找到其上一个节点,让上一个节点指向值为3的结点。

但这是一个单链表,我们怎么找到上一个呢?只好用一个cur指针从头开始走,cur→next就是可能要删除的节点。

1.1 在原链表删除

我们还需要考虑边界情况:删除头结点。此时只要让head向后走。

在这里插入图片描述

但是,这样我们的删除方法就不统一了,头结点是一种删法,其他结点又是另一种删法,容易让代码变多,逻辑也不够简单。

1.2 虚拟头结点

想要统一其实很简单,我们最重要的就是找上一个,但是要删除头结点的时候找不到上一个,那就再给一个虚拟头结点,让它指向真正头结点。头结点就有“上一个结点”了。

在这里插入图片描述
此时,dummyhead→next其实就是真正的head,删除方法也能统一。

2. 参考代码

原链表删除

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode *dying = nullptr;
        // 移除头部需移除的元素
        while (head != nullptr && head->val == val) {
            dying = head;
            head = head->next;
            delete dying;
        }

        // cur不可能是需要移除的元素,需要移除的元素只可能是cur->next
        ListNode *cur = head; 
        while (cur != nullptr && cur->next != nullptr) {
            if (cur->next->val == val) {
                dying = cur->next;
                cur->next = cur->next->next;
                delete dying;
            } else {
                cur = cur->next;
            }
        }

        return head;
    }
};

需要注意:当我们删除某个节点时,cur不需要变,下一次要探测的结点恰好就是cur→next→next。
在这里插入图片描述

虚拟头节点

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) 
    {
        ListNode* dummy = new ListNode(-1, head);
        ListNode* cur = dummy;
        while(cur->next)
        {
            if(cur->next->val == val)
            {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            }
            else cur = cur->next;
        }
        ListNode* result = dummy->next;
        delete dummy;
        return result;
    }
};

设计链表

1. 思路

链表操作我们都了解了,就是修改某些节点之间的链接关系,按题目要求做即可。这里实现带虚拟头节点的链表。

2. 参考代码

class MyLinkedList {
public:
    MyLinkedList() {
        _dummy = new ListNode(-1);
        _size = 0;
    }

    void print() {
        ListNode *cur = _dummy->__next;
        while (cur) {
            cout << cur->__val << " ";
            cur = cur->__next;
        }
        cout << endl;
    }
    
    int get(int index) {
        if (index >= _size) return -1;

        ListNode *cur = _dummy->__next;
        for (int i = 0; i < index; ++i) cur = cur->__next;
        return cur->__val;
    }
    
    void addAtHead(int val) {
        ListNode *newNode = new ListNode(val, _dummy->__next);
        _dummy->__next = newNode;
        ++_size;
    }
    
    void addAtTail(int val) {
        ListNode *tail = _dummy;
        while (tail->__next != nullptr) tail = tail->__next;

        ListNode *newNode = new ListNode(val);
        tail->__next = newNode;
        ++_size;
    }
    
    // 将一个值为 val 的节点插入到链表中下标为 index 的节点之前
    void addAtIndex(int index, int val) {
        if (index > _size) return;

        ListNode *prev = _dummy;
        for (int i = 0; i < index; ++i) prev = prev->__next;

        ListNode *newNode = new ListNode(val, prev->__next);
        prev->__next = newNode;
        ++_size;
    }
    
    void deleteAtIndex(int index) {
        if (index >= _size) return;

        ListNode *prev = _dummy;
        ListNode *cur = prev->__next;
        for (int i = 0; i < index; ++i) {
            prev = cur;
            cur = cur->__next;
        }
        ListNode *dying = cur;
        prev->__next = cur->__next;
        delete dying;
        --_size;
    }
private:
    struct ListNode {
        int __val;
        ListNode *__next;
        ListNode(int val, ListNode *next = nullptr) 
        : __val(val), __next(next) {}
    };
private:
    ListNode *_dummy;
    size_t _size;
};

今天的分享就到这里了,感谢您能看到这里。

这里是培根的blog,期待与你共同进步!

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

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

相关文章

利用QT画图像的直方图

1.什么是直方图 直方图是一种图形化展示数据频率分布的方式。它将样本数据分成一系列相邻的区间&#xff0c;统计每个区间内数据所占比例或数量&#xff0c;并用矩形条形图表现出来。直方图可以反映样本数据的分布情况&#xff0c;例如它们的集中趋势、对称性和离散程度等。 …

几种解决mfc140.dll文件缺失的方法,电脑提示mfc140.dll怎么办

电脑提示mfc140.dll缺失&#xff0c;如果你不去处理的话&#xff0c;那么你的程序游戏什么都是启动不了的&#xff0c;如果你想知道有什么方法可以解决那么可以参考这篇文章进行解决&#xff0c;今天给大家几种解决mfc140.dll文件缺失的方法。电脑提示mfc140.dll也不用担心解决…

shell的for循环

列表for循环 列表for循环的语法结构如下: for variablein list #每一次循环&#xff0c;依次把列表list 中的一个值赋给循环变量 do #循环体开始的标志commands #循环变量每取一次值&#xff0c;循环体就执行一遍commands done #循环结束的标志&#xff0c;返回循环顶…

腾讯待办关停,导出的数据怎么恢复到手机上面?

相信有不少腾讯待办的用户都发现了其“业务关停通知”&#xff0c;确实如此&#xff0c;由于业务调整&#xff0c;腾讯待办将于2023年的12月20日全面停止运营并下架&#xff0c;这就表示以后我们无法继续使用它了。在腾讯待办关停之前&#xff0c;绝大多数用户需要做的就是及时…

推荐一款功能强大的在线文件预览工具-kkFileView

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

【论文笔记】UniPAD: A Universal Pre-training Paradigm for Autonomous Driving

原文链接&#xff1a;https://arxiv.org/pdf/2310.08370.pdf 1. 引言 过去的3D场景理解预训练方法多采用2D图像领域中的想法&#xff0c;可大致分为基于对比的方法和基于MAE的方法。 基于对比的方法通过对比损失&#xff0c;在特征空间中将相似的3D点拉进而将不相似的点分开…

Oracle获取执行计划的6种方法

一、什么是执行计划&#xff1f; 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述。 执行计划描述了SQL引擎为执行SQL语句进行的操作&#xff0c;分析SQL语句相关的性能问题或仅仅质疑查询优化器的决定时&#xff0c;必须知道执行计划&#xff1b;所以执行计划常用…

Django框架的推导

文章目录 Web应用简介什么是Web框架&#xff1f;什么是Web&#xff1f;应用程序的两种模式Web应用程序的优缺点 手写Web框架HTTP协议的相关知识1.四大特性2.请求数据格式3.响应数据格式 手写框架 使用wsgiref模块基于wsgiref模块搭建Web框架(最初版)基于wsgiref模块搭建Web框架…

口袋参谋:像我这样做买家秀,日销翻一番!

​为什么别人的买家秀那么好看&#xff1f;而你家的买家秀却平平无奇&#xff01;想知道原因的&#xff0c;请往下看。 01 买家秀的作用 我们先简单说说买家秀的作用 首先就是可以表明产品和实物的真实性&#xff0c;与打开的详情页相符&#xff0c;加强详情页描述的信任度。…

Android transform旋转rotate圆角矩形图roundedCorners,Kotlin

Android transform旋转rotate圆角矩形图roundedCorners&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.…

YOLOv4: Optimal Speed and Accuracy of Object Detection(2020.4)

文章目录 AbstractIntroductionRelated workObject detection modelsBag of freebiesBag of specials MethodologySelection of architectureSelection of BoF and BoSAdditional improvementsYOLOv4 ExperimentsResults表8列出了使用Maxwell GPU的帧率对比结果表9列出了使用Pa…

一图掌握PMP49个过程组

一图掌握PMP 49个过程组

nigix安装以及遇到的问题

Nginx配置 nginx双击闪退如何解决 修改配置文件 端口冲突&#xff0c;将端口改为90 Nginx 动静分离&#xff08;前端的代码单独运行&#xff09; 将html文件夹里面的东西放到nginx里面的HTMl文件夹里面 负载均衡&#xff08;轮询&#xff0c;权重&#xff0c;哈希&#xff…

Android 13.0 Settings主页面去掉FocusRecyclerView相关功能

1.前言 在13.0的系统rom产品定制化开发中,在系统Settings主页面的主菜单中,在测试某些功能的时候,比如开启护眼模式和改变系统密度会在主菜单第一项的网络菜单头部增加 自定义您的设备和设置护眼模式时间安排 等等相关的设置模块 这对于菜单布局显示相当不美观,所以根据系…

nginx反向代理报错合集

本文汇集了最近在使用nginx反向代理过程中遇到的一系列错误及其解决办法。 1缺乏支持项导致nginx配置错误 在利用sudo ./configure --with-http_ssl_module --with-http_stub_status_module进行配置时&#xff0c;往往会遇到以下类型的错误 error: the HTTP rewrite module …

字符加密A--E,B-F,W--A

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为选择结构编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 二、题目分析 三、解题 程序运行代码 #include<stdio.h> int main(){char c;cgetchar();if(c>a&&…

【C/PTA——7.数组1】

C/PTA——7.数组1 7-1 计算最大值出现的次数1.题目要求2.代码实现 7-2 求一批整数中出现最多的个位数字1.题目要求2.代码实现 7-3 装箱问题1.题目要求2.代码实现 7-4 数组-值钱的微信号1.题目要求2.代码实现 7-5 数组-吹泡泡1.题目要求2.代码实现 7-6 数组-数学鬼才1.题目要求2…

基于工业无线DTU的空气污染监测防治方案

​秋冬季是我国大气污染天气的高发、频发期&#xff0c;也是大气污染防治的关键期、敏感期。针对空气质量的监测和防治&#xff0c;可以利用佰马工业无线DTU&#xff0c;搭建分布式大气传感器监测网络&#xff0c;实现对广域空气质量、成分、变化的实时监测&#xff0c;从而实现…

汽车工业生产线数字孪生可视化管理平台,赋予工厂车间数字化智慧化管理

在工业4.0 的时代背景下&#xff0c;随着企业数字化进程的推进&#xff0c;数字孪生可视化技术逐渐在汽车行业得到广泛应用&#xff0c;数字孪生智慧工厂的建设也成为了汽车行业数字化转型的趋势之一。汽车制造业属于典型的离散制造行业&#xff0c;汽车生产包含冲压、焊接、涂…