C++ 链表构建与基本操作

2023-05-16

本文没啥干货,纯属笔记,建议出门左拐哈

目录

1、创建单向链表

2、在链表结尾添加元素

3、从链表中删除第一个值为 val 的元素

4、测试用例 


1、创建单向链表

单向链表可以使用结构体的形式创建,定义一个名为 ListNode 的结构体如下:

struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}  // 重载函数,默认值为1
    ListNode(int x) : val(x), next(nullptr) {}  // 重载函数,按值 x 初始化
    ListNode(int x, ListNode *next) : val(x), next(next) {}  // 重载函数,使用新的节点初始化
};

该结构体定义过程中使用到了函数重载。

函数重载:

同一作用域内的几个名字相同形参列表不同的函数称作重载(overloaded)函数 。当调用这些操作时,编译器会根据传递的实参的类型推断想要的是那个函数。

2、在链表结尾添加元素

链表结尾添加元素的方式有很多种

1、首先是最复杂的一种:使用双重指针

void AddToTail_0(ListNode** head, int val)
{
    ListNode* pNew = new ListNode(val);  // 初始化要加入的尾节点
    if(*head == nullptr) // 首先判断头指针
    {
        *head = pNew;
    }
    else  // 头指针不为空则继续后续的判断
    {
        ListNode *p = *head;
        while(p->next != nullptr)  // 寻找结尾
            p = p->next;
        p->next = pNew;
    }
}

2、简单的:使用单重指针

void AddToTail(ListNode* head, int val)
{
    ListNode* pNew = new ListNode(val);
    if(head == nullptr)
        head = pNew;
    else
    {
        ListNode* node = head;
        while(node->next != nullptr)
            node = node->next;
        node->next = pNew;
    }
}

这种方式第一步与双重指针类似,必须要先判断头节点本身是否为空。如果嫌这样还是麻烦的话还有一种简化的方式:使用哨兵节点。哨兵节点作为临时节点插入到头节点之前,这样就可以从开始就使用 p->next 的格式判断了,但是这种情况记住最后要释放哨兵节点。代码如下:

void AddToTail(ListNode* head, int val)
{
    ListNode* prev = new ListNode(0); // 定义哨兵节点
    prev->next = head;  // 将哨兵节点放到头节点前
    ListNode* pNew = new ListNode(val);  // 初始化要加入的尾节点 
    ListNode* node = prev;
    while(node->next != nullptr)
        node = node->next;
    node->next = pNew;
    head = prev->next; // 从哨兵节点后取回头节点
    delete prev; // 释放哨兵节点的内存
}

3、从链表中删除第一个值为 val 的元素

直接放单指针的版本了,双指针容易绕晕就不记了。 

void delNode(ListNode* head, int val)
{
    ListNode* pToBrDel = nullptr;  // 暂存被删除节点,用于释放其占用的内存
    if(head == nullptr)  // 链表为空
        return ;
    else if(head->val == val)  // 第一个就是要找的值
    {
        pToBrDel = head;
        head = head->next;
    }
        
    ListNode* node = head; // 定义临时节点
    while(node->next != nullptr)
    {
        if(node->next->val == val)
        {
            pToBrDel = node->next;
            node->next = node->next->next;
            break;
        }
        node = node->next;
    }
    if(pToBrDel != nullptr)  // 释放被删除节点所占的内存
        delete pToBrDel;
}

使用哨兵节点的版本:

void delNode(ListNode* head, int val)
{
    ListNode* pToBrDel = nullptr;  // 暂存被删除节点,用于释放其占用的内存
    ListNode* prev = new ListNode(0); // 定义哨兵节点
    prev->next = head;
        
    ListNode* node = prev; // 定义临时节点
    while(node->next != nullptr)
    {
        if(node->next->val == val)
        {
            pToBrDel = node->next;
            node->next = node->next->next;
            break;
        }
        node = node->next;
    }
    if(pToBrDel != nullptr)  // 释放被删除节点所占的内存
        delete pToBrDel;
    head = prev->next; // 从哨兵节点后取回头节点
    delete prev; // 释放哨兵节点的内存
}

4、测试用例

int main()
{
    ListNode *li = new ListNode(); // 初始化链表
    cout << "insert operator: " << endl;
    AddToTail(li, 1);
    AddToTail(li, 2);
    AddToTail(li, 3);
    ListNode *temp = li;
    while(1) // 打印
    if(temp != nullptr)
    {
        cout << temp->val << endl;
        temp = temp->next;
    }
    else break;

    cout << "delete operator: " << endl;
    delNode(li, 2);
    delNode(li, 1);
    ListNode *temp1 = li;
    while(1) // 打印
    if(temp1 != nullptr)
    {
        cout << temp1->val << endl;
        temp1 = temp1->next;
    }
    else break;

    return 0;
}

/**************** 运行结果 
0
1
2
3
delete operator:
0
3
****************/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 链表构建与基本操作 的相关文章

  • Python基础

    输出函数print 输出内容可以是 1 数字 print 66 6 2 字符串 print hello world 单引号双引号都可 3 含有运算符的表达式 print 3 43 1 4 输出到文件中 fp 61 open D text t
  • PID控制器的优缺点和周期

    PID控制器参数优缺点 PID控制器简介 PID控制器是非常经典的一种控制算法 xff0c 是不需要知道系统的模型 xff0c 仅仅根据期望与现状的偏差调节 xff0c 使之能够到达期望的一种线性控制器 优点 xff1a 使用简单 xff0
  • 嵌入式开发自救指南(嵌入式怎么高薪基本思路)

    文章目录 前言打工的基本逻辑 xff1a 生产者思维价值与价格概念介绍需求与价值供给与价值 总结 一 为什么选择嵌入式四个角度个人需求现有资源与长板职业优先级排序 二 距离目标还有多远距离目标距离 三 路线半年路线为什么这样做 前言 为什么
  • docker安装firefox

    下载镜像 docker pull jlesage firefox 运行容器 docker run d name 61 firefox e TZ 61 Asia Hong Kong p 5800 5800 p 5900 5900 shm si
  • freertos学习之路1-裸机和rtos的区别

    写在最前 由于工作需要 xff0c 需要开始学习freertos的相关知识 xff0c 本专题主要记录freertos的相关内容 参考 xff1a https www bilibili com video BV19g411p7UT 正点原子
  • Windows10 配置 VSCode 的 C++环境

    目录 0 不同符号代表的 CPU 的位数 xff1a 1 下载 MinGW64 包 xff0c 配置C C 43 43 的Windows环境 2 在 VSCode 里配置 C 43 43 0 不同符号代表的 CPU 的位数 xff1a x8
  • MPU MCU CPU GPU之间的关系

    CPU xff08 Central Processing Unit xff0c 中央处理器 是计算机系统的主要处理器 xff0c 它负责执行指令 处理数据和控制计算机系统的操作 CPU通常被用于通用计算和控制任务 xff0c 如桌面电脑 服
  • stm32外设-中断详解

    0 写在最前 本栏目笔记都是基于stm32F10x 1 中断是啥 xff1f 什么是中断 xff1a CPU在处理某一事件A时 xff0c 发生的另外某一事件B请求CPU去处理 xff08 产生了中断 xff09 xff0c 随后CPU暂时
  • Darknet——yolo3训练自己的数据集+在ros环境下实现目标检测实战教程(三)——应用在ROS上

    文章目录 前言一 darknet ros代码简析二 修改ros驱动包的文件内容三 ros系统下运行效果总结 前言 Darknet yolo3训练自己的数据集 43 在ros环境下实现目标检测实战教程 xff08 一 xff09 环境配置 D
  • LSB(Linux Standard Base)通用部分学习自用(1)

    前言 什么是LSB xff08 借用了这位博主的高见 xff09 LSB文档下载 自用 xff0c 如有错误请指出 xff0c 不胜感激 本系列基于LSB Core Generic 5 0 介绍 The LSB defines a bina
  • cocos2dx 第七课 动作和动画

    一 动作的行为 runAction Action act 运行动作 stopAction Action act 停止动作 stopActionByTag int tag 停止动作 stopAllActions 停止节点所有动作 二 动作的种
  • 线性最小方差估计理论推导

    线性最小方差估计理论推导 定义 也叫线性最小均方误差估计 xff0c 顾名思义 xff0c 就是使估计误差的平方和的均值达到最小 理论推导 假设系统 z 61 H x 43
  • D435i、D435、D415、T265的Realsense_viewer环境搭配及安装

    安装步骤 1 注册服务器公钥 sudo apt span class token operator span key adv span class token operator span keyserver keys span class
  • VS Code下利用Cmake开发C++-单文件

    单文件 xff1a 第一步 xff1a 创建CmakeLists txt文件 第二步 xff1a 编写CmakeLists 设置最小版本 span class token function cmake minimum required sp
  • ECharts学习--主题设置

    xff08 1 xff09 内置主题 echarts中默认主题有两个 light dark 在初始化对象方法中 xff0c init可以指明 xff1a xff08 1 xff09 dark var mCharts 61 echarts i
  • 隔壁老王看了都会的文章:STM32串口实验——单片机与上位机交互信息

    今天介绍USART串口通信的使用 xff0c 目的在于会用串口传送和接收数据 内容包含了NVIC中断的知识 xff0c 下一篇着重讲NVIC中断 ADC在下下一篇 主要还是先看懂USART的相关代码 什么是串行通信 我们对通信的字面意思理解
  • C++ 字符串(string)常用操作总结

    目录 0 常用功能汇总 1 定义一个字符串 2 读写 string 操作 3 查询字符串信息 索引 4 拼接 比较等操作 5 cctype 头文件 判断字符类型 xff1a 大 小写字母 标点 数字等 6 for 循环遍历 7 修改 str
  • USB学习笔记——USB通信过程与枚举过程

    在网上看到一篇文章就是讲这个的 xff0c 仔细阅读后获得了很多感触 xff0c 整理总结如下 一 USB接口 在USB的集线器端D xff0c D 43 都接了下拉电阻 xff0c 而USB设备端的D xff0c D 43 接了上拉电阻
  • BGP协议的难点笔记和重要性

    bgp的报文 有五种报文类型bgp的包头长什么样 xff1a 由market 标记 length 长度 type 报文类型 这3个东西组成open报文 xff1a 用来维护bgp的建立 xff0c 就是bgp对等体之间的信息建立update

随机推荐

  • 使用xfsdump及xfsrestore备份并恢复文件

    xfs提供了xfsdump和xfsrestore工具 xff0c 协助备份xfs文件系统中的数据 xfsdump按inode顺序备份一个xfs文件系统8 xfs备份级别有2种 xff1a 0表示完全备份 xff0c 1 9表示增量备份 xf
  • 电赛准备过程记录

    电赛记录 xff08 1 xff09 2021全国大学生电子设计大赛参赛纪实 xff08 无人机赛题 xff09 提示 xff1a 写完文章后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 电赛记录 xf
  • Jetson TX2新手上路全记录(1)

    Jetson TX2小白零基础上手记录 xff08 1 xff09 暑假申请了一块TX2进行学习 xff0c 从头开始记录学习过程 趁着在装虚拟机先唠两句 文章目录 Jetson TX2小白零基础上手记录 xff08 1 xff09 开箱环
  • Jetson TX2新手上路全记录(3)

    ng 3 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 例如 xff1a 第一章 Python 机器学习入门之pandas的使用 提示 xff1a 写完文章后 xff0c 目录可以自动生成 xff
  • 傅里叶变换详解

    一 用途 xff1a 任意 的函数经过一定的分解 xff0c 都能够表示为正弦函数的线性组合形式 比如想要过滤一首音乐中的噪音 xff0c 我们可以使用傅里叶变换将叠加后的图像分离为一个个纯声的正弦图像 xff0c 去掉特定频率的噪声就能实
  • git如何删除本地所有未提交的更改

    在使用git的时候 xff0c 如果本地做的修改都不想保留了 xff0c 可以通过下面命令恢复成HEAD版本 xff0c 未提交的以及加入暂存区中的修改都会被舍弃 git reset hard git clean xdf 转自
  • ESP32的RMT模块项目实用

    1 技术背景 最近公司在用ESP32的模组方案实现智能音箱的相关功能的项目 需要展示模组的网络状态以及音箱的语音交互状态 xff0c 找了一家RGB灯板供应商 需要模组通过一个io口输出脉冲波形 xff0c 来控制灯板切换模式 xff0c
  • ESP32 LOG库使用

    ESP32 log库 官方文档 一 printf是不可重入函数 printf不能在中断中被调用的原因是它是一个不可重入函数 xff0c 而在中断中要避免调用不可重入函数 xff0c 首先我们先说说什么是不可重入函数 简单说来 xff0c 区
  • C++ 数组(vector)常用操作总结

    目录 1 vector对象的定义和初始化方式 2 vector 常用基础操作 3 使用迭代器的遍历 插入 删除操作 4 vector 元素的重排操作 xff08 排序 逆序等 xff09 5 vector 中找最值 6 改变vector大小
  • 小熊派开发板移植RT-FOTA

    前言 买了小熊派的开发板 xff0c 将demo code验证完成之后就放下了 刚好最近工作也在做OTA相关的开发 xff0c 发现自己对于升级的功能还不够了解 xff0c 在码云找到了一位大神基于RTThread的RT FOTA代码 xf
  • 小熊派移植RT-Thread 的app代码

    前言 在上一篇我们已经讲解了如何移植RT FOTA到小熊派开发板 本篇我们将继续移植RT Thread xff0c 实现app代码的移植开发 xff0c 并将BootLoader和app一起烧录到开发板 xff0c 完成BootLoader
  • easyflash源码分析流程图

    最近周末刚好有空 xff0c 将easyflash源码看了一下 xff0c 了解了作者的设计理念 将学习内容整理成流程图贴上来 1 esayflash初始化流程 2 esayflash set env
  • .git bojects目录文件为空

    这里写自定义目录标题 git error object file git objects b9 e269f50db2a3415cc8ad5ba40b82b9b6a13d45 is empty 解决方法 xff1a 1 find git ob
  • freertos与rtthread内核实现的不同处

    一直在使用rtos作为主要开发内容 xff0c 却没有详细了解过rtos的内核实现机制 最近一个月 xff0c 抽了点时间将freertos和rtthread的内核代码看了下 xff0c 了解了实时系统的实现机制和设计思想 这里学习free
  • FlashDB移植与应用

    FlashDB移植与应用 最近工作需要 xff0c 对设备参数进行备份存储 xff0c 由于之前使用的是简单的分区备份方法 Easyflash的单实例不再适用 后面发现大神基于easyflash进行了新版本更新 xff0c 但是不向前兼容
  • ROBOMASTER机甲大师赛视觉组学习方案

    ROBOMASTER机甲大师赛视觉学习方案 视觉技能学习踩坑硬件平台环境配置个人修为坑 机甲大师 xff08 RoboMaster xff09 是由大疆创新 xff08 DJI xff09 的创始人汪滔发起并承办 由共青团中央 全国学联 深
  • (一)HTML5 基础

    文章目录 一 HTML 简介二 HTML5 骨架1 文档类型说明2 W3C 组织3 标签4 html 标签对5 head 标签对 1 meta 标签对 2 title 标签对 3 SEO 6 body 标签对 三 文字标签1 标题标签2 段
  • 程序员真的是我们喜欢的工作吗?是生活?还是理想?

    有人说程序员年薪近百万 xff01 程序员 成实现阶级跨越的好职业 xff1f 在大多数人的印象里 xff0c 程序员是非常具有 钱途 的职业 xff0c 年薪至少几十万 半年赚一套房 要嫁就嫁程序员 等类似的消息满天飞 xff0c 足见程
  • C盘被pycharm的缓存数据占满,清理content.dat.storageData

    当你用PyCharm跑一些特殊的程序时 xff0c 你会发现你的C盘容量减少或被占满 xff0c 那么如何找到那些缓存数据并释放C盘的磁盘空间呢 xff1f 我是采用下面的方法 xff1a 先下载一个磁盘扫描软件 xff0c 我用的是Spa
  • C++ 链表构建与基本操作

    本文没啥干货 xff0c 纯属笔记 xff0c 建议出门左拐哈 目录 1 创建单向链表 2 在链表结尾添加元素 3 从链表中删除第一个值为 val 的元素 4 测试用例 1 创建单向链表 单向链表可以使用结构体的形式创建 xff0c 定义一