C++链表相关内容温习回顾——移除链表元素

   本文主要对之前学过的C++链表相关内容进行温习回顾,并以 移除链表元素 为例,进行应用。

   关于链表的基础理论可见:链表理论基础

   应用示例:LeetCode 203 移除链表元素

   https://leetcode.cn/problems/remove-linked-list-elements/

在这里插入图片描述

   0、例题描述如下:

在这里插入图片描述

   1、带详细注释的可在本地IDE运行的C++链表实现如下:

#include<iostream>
#include<vector>using namespace std;// 定义链表的节点结构
struct ListNode
{int val;  // 节点存储的值ListNode* next;  // 指向下一个节点的指针ListNode() :val(0), next(nullptr) {}  // 默认构造函数ListNode(int x) :val(x), next(nullptr) {}  // 构造函数初始化值ListNode(int x, ListNode* ptr) :val(x), next(ptr) {}  // 构造函数初始化值和指针
};// 定义解决问题的类
class Solution
{
public:// 移除链表中所有值为val的节点ListNode* removeElements(ListNode* head, int val){  ListNode* vhead = new ListNode(0);  // 创建虚拟头节点以简化边界处理vhead->next = head;  // 将虚拟头节点指向实际的头节点ListNode* cur = vhead;  // 使用cur遍历链表while (cur->next != nullptr)  // 遍历链表直到尾部{if (cur->next->val == val)  // 如果当前节点的下一个节点的值等于val{ListNode* temp = cur->next;  // 临时保存需要删除的节点cur->next = cur->next->next;  // 将当前节点的指针指向下下个节点delete temp;  // 删除节点释放内存}else{cur = cur->next;  // 移动到下一个节点}}head = vhead->next;  // 更新头节点delete vhead;  // 删除虚拟头节点return head;  // 返回新的头节点}
};int main()
{// 创建测试链表 [1,2,6,3,4,5,6]ListNode* head = new ListNode(1);head->next = new ListNode(2);head->next->next = new ListNode(6);head->next->next->next = new ListNode(3);head->next->next->next->next = new ListNode(4);head->next->next->next->next->next = new ListNode(5);head->next->next->next->next->next->next = new ListNode(6);Solution solution;int val = 6;head = solution.removeElements(head, val);  // 调用removeElements函数移除值为6的节点// 打印新的链表ListNode* cur = head;while (cur != nullptr)  // 遍历链表打印每个节点的值{cout << cur->val << " ";cur = cur->next;}cout << endl;// 释放链表内存cur = head;ListNode* next;while (cur != nullptr){next = cur->next;  // 保存下一个节点delete cur;  // 删除当前节点cur = next;  // 移动到下一个节点}
}

   运行结果如下:

在这里插入图片描述

   2、程序的详细介绍

   这个程序实现了一个特定的链表操作,即删除链表中所有值等于给定整数 val 的节点。程序分为几个主要部分:

   1. ListNode 结构体:定义链表的节点,每个节点包含一个整数值 val 和一个指向下一个节点的指针 next

   2. Solution 类

   - removeElements 方法:这是类的主要方法,用于移除链表中所有值为 val 的节点。方法通过添加一个虚拟头节点来简化边界条件的处理,然后遍历链表,逐个检查每个节点的值。

   3. main 函数

   - 创建并初始化链表。

   - 调用 removeElements 方法处理链表。

   - 打印处理后的链表结果。

   - 释放链表中所有节点的内存,以防止内存泄漏。

   4. 函数语句的详情介绍见上面代码的注释

   这个程序特别适用于学习和理解链表的操作,特别是如何处理删除链表节点时的边界条件。通过使用虚拟头节点,代码更加简洁,逻辑更清晰。

   3、LeetCode 核心代码模式源码:

/*** 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){  ListNode* vhead = new ListNode(0);vhead->next = head;ListNode* cur = vhead;while (cur->next != nullptr){if (cur->next->val == val){ListNode* temp = cur->next;cur->next = cur->next->next;delete temp;}else{cur = cur->next;}}head = vhead->next;delete vhead;return head;}
};

   4、一种可能的ACM模式源码:

   由于未知具体的输入给定形式,本例子中以如下所示的输入格式为例

[1,2,6,3,4,5,6] 6

   示例程序如下:

#include<iostream>
#include<vector>using namespace std;struct ListNode {int val;ListNode* next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode* ptr) : val(x), next(ptr) {}
};class Solution {
public:ListNode* removeElements(ListNode* head, int val) {ListNode* vhead = new ListNode(0);  // 创建虚拟头节点以简化边界处理vhead->next = head;ListNode* cur = vhead;while (cur->next != nullptr) {if (cur->next->val == val) {ListNode* temp = cur->next;cur->next = cur->next->next;delete temp;} else {cur = cur->next;}}head = vhead->next;delete vhead;return head;}
};int main() {vector<int> nums;int num, val;char ch;// 读取链表数值,以及需要移除的数值while (cin >> ch && ch != ']') { // 读取直到遇到 ']'if (cin >> num) {nums.push_back(num);cin >> ch; // 读取逗号或者结束的 ']'}}cin >> val; // 读取需要移除的数值// 构建链表ListNode* head = nullptr, * tail = nullptr;for (int number : nums) {ListNode* newNode = new ListNode(number);if (!head) {head = tail = newNode;} else {tail->next = newNode;tail = newNode;}}Solution solution;head = solution.removeElements(head, val);// 输出新链表ListNode* cur = head;if (cur) {cout << cur->val;cur = cur->next;}while (cur) {cout << "," << cur->val;cur = cur->next;}cout << endl;// 释放链表内存cur = head;ListNode* next;while (cur) {next = cur->next;delete cur;cur = next;}
}

   参考输入的运行结果如下:

1,2,3,4,5

在这里插入图片描述

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

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

相关文章

旋转的六边形

【题目描述】 输入一个整数n&#xff0c;绘制出n个不断旋转的六边形&#xff0c;如图1所示。 图1 旋转的六边形图形 【要求】 -绘制速度设为最快&#xff0c;画笔粗细为3。 -六边形每次旋转10度&#xff0c;边长增加10%。 【分析】 这是一个同心正六边&#xff0c;六边形边…

spring:深入理解@EnableAspectJAutoProxy

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

Airtest 使用指南

Airtest 介绍 准备工作 AirtestIDE 安装与启动: https://airtest.doc.io.netease.com/IDEdocs/getting_started/AirtestIDE_install/ 电脑端的准备工作完成后,对于手机端只需要打开允许USB调试,当首次运行时会提示安装PocoService,同意即可。 界面介绍

微信登录过程分析

文章目录 1、微信登录过程分析2、身份认证实现方案&#xff1a;3、AOP回顾3.1、AOP底层 1、微信登录过程分析 2、身份认证实现方案&#xff1a; 网关过滤器&#xff1a;gateway网关GlobalFilter自定义过滤器&#xff0c;拦截经过网关的所有请求SpringMVC拦截器&#xff1a;代码…

现货白银实时交易平台的成长阶段 你出在哪个阶段?

很多人喜欢在现货白银平台上做模拟交易&#xff0c;因为他们认为现货白银实时交易平台上交易太痛苦了&#xff0c;不光随时会面临风险&#xff0c;而且还可能让自己出现大的亏损。如果投资者认为痛苦&#xff0c;那笔者觉得投资者不妨将在现货白银实时交易平台上做交易&#xf…

0 简单的图像分类

本文主要针对交通标识图片进行分类&#xff0c;包含62类&#xff0c;这个就是当前科大讯飞比赛&#xff0c;目前准确率在0.94左右&#xff0c;难点如下&#xff1a; 1 类别不均衡&#xff0c;有得种类图片2百多&#xff0c;有个只有10个不到&#xff1b; 2 像素大小不同&…

滑动窗口(LeeCode209题,以JS为例)

什么是滑动窗口&#xff1f; 滑动窗口是算法中一种非常有用的技术&#xff0c;特别是在处理数据序列或数组时。它的核心思想是维护一个固定大小的窗口&#xff0c;这个窗口在数据序列上滑动&#xff0c;以便于在窗口内的元素上进行操作或计算。滑动窗口技术通常用于解决与数据…

对 2024 年美赛选题的建议

对2024年美赛选题的建议包括&#xff1a; 1. 深入探讨当下全球面临的重大问题和挑战&#xff1a;鉴于美赛通常聚焦于全球性议题&#xff0c;如气候变化、可持续发展、数据分析等&#xff0c;参赛学生应关注这些议题&#xff0c;并深入研究相关数据与背景信息&#xff0c;以提出…

单片机建立自己的库文件(4)

文章目录 前言一、新建自己的外设文件夹1.新建外设文件夹&#xff0c;做项目好项目文件管理2.将之前写的.c .h 文件添加到文件夹中 二、在软件中添加项目 .c文件2.1 编译工程保证没问题2. 修改项目列表下的名称 三、在软件项目中添加 .h文件路径四、实际使用测试总结 前言 提示…

sheng的学习笔记-AI-集成学习(adaboost,bagging,随机森林)

ai目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 目录​​​​​​​ 集成学习 什么是集成学习 集成学习一般结构&#xff1a; 示意图 弱学习器 经典算法 Boosting 什么是boosting 方法图 AdaBoost 算法 AdaBoost示意图 流程解析&#xff1a; 错误分类率error…

太速科技-FMC213V3-基于FMC兼容1.8V IO的Full Camera Link 输入子卡

FMC213V3-基于FMC兼容1.8V IO的Full Camera Link 输入子卡 一、板卡概述 该板卡为了考虑兼容1.8V电平IO&#xff0c;适配Virtex7&#xff0c;Kintex Ultrascale&#xff0c;Virtex ultrasacle FPGA而特制&#xff0c;如果要兼容原来的3.3V 也可以修改硬件参数。板卡支持1路…

快速欧氏聚类与普通欧氏聚类比较

1、前言 文献《FEC: Fast Euclidean Clustering for Point Cloud Segmentation》介绍了一种快速欧氏聚类方法,大概原理可以参考如下图,具体原理可以参考参考文献。 2、时间效率比较:快速欧氏聚类VS普通欧氏聚类 网上搜集的快速欧式聚类,与自己手写的普通欧式聚类进行对比,…

SLG火并6月:多强鼎立,增量用户发展成行业新题

SLG赛道进入到6月&#xff0c;《三国&#xff1a;谋定天下》、《野兽领主&#xff1a;新世界》、《无尽冬日》大量新品袭来搅动市场。 在这样的关口&#xff0c;占据SLG半壁江山的灵犀互娱《三国志战略版》先一步刊登出战报&#xff0c;宣布1亿SLG玩家已收归麾下。 但新的挑战…

Linux时间子系统6:NTP原理和Linux NTP校时机制

一、前言 上篇介绍了时间同步的基本概念和常见的时间同步协议NTP、PTP&#xff0c;本篇将详细介绍NTP的原理以及NTP在Linux上如何实现校时。 二、NTP原理介绍 1. 什么是NTP 网络时间协议&#xff08;英语&#xff1a;Network Time Protocol&#xff0c;缩写&#xff1a;NTP&a…

华为数通企业面试笔试实验题

1. 笔试题 1.1 实验拓扑 1.2 实验要求 公司A为小型销售公司,需要实现基本上网功能,蓝色部分为外网线,提供DHCP服务 DnsServer:114.114.114.114 帮助网管排查某一台计算机在某一台交换机的某个端口 2. 操作步骤 配置路由器相关的LAN侧接口IP地址 配置DHCP项,要求有PC1与PC2…

大模型KV Cache节省神器MLA学习笔记(包含推理时的矩阵吸收分析)

首先&#xff0c;本文回顾了MHA的计算方式以及KV Cache的原理&#xff0c;然后深入到了DeepSeek V2的MLA的原理介绍&#xff0c;同时对MLA节省的KV Cache比例做了详细的计算解读。接着&#xff0c;带着对原理的理解理清了HuggingFace MLA的全部实现&#xff0c;每行代码都去对应…

软件改为开机自启动

1.按键 win R,输入“shell:startup”命令, 然后就可以打开启动目录了&#xff0c;如下&#xff1a; 2.然后&#xff0c;把要开机启动的程序的图标拖进去即可。 参考&#xff1a;开机启动项如何设置

JAVA面试(六)

缓存 MemcachedredisRedis常见数据类型和使用Redis缓存持久化RDB-快照AOF-追加文件 Redis数据过期机制惰性删除定期删除 Redis缓存淘汰策略&#xff08;8种&#xff09;算法LRU &#xff08;Least Recently Used&#xff09;&#xff1a;最近最少使用LFU&#xff08;Least Freq…

day12--150. 逆波兰表达式求值+239. 滑动窗口最大值+ 347. 前 K 个高频元素

一、150. 逆波兰表达式求值 题目链接&#xff1a;https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/ 文章讲解&#xff1a;https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html 视频…

R可视化:微生物相对丰度或富集热图可视化

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2介绍 热图(Heatmap)是一种数据可视化方法,它通过颜色的深浅或色调的变化来展示数据的分布和密度。在微生物学领域,热图常用于表示微生物在不同分组(如…