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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EIQ-ABC 分析法在配送中心储位分配中的应用

配送中心运作效率的高低主要取决于仓储业务流程的作业效率&#xff0c;在配送作业流程中&#xff0c;储位分配的是否合理性成为影响配送运作效率的重要因素。为实现储位的合理分配&#xff0c;提出通过对订单信息的分析&#xff0c;并应用 EIQ-ABC 分析法&#xff0c;以此实现缩…

示例:WPF中应用DataGrid读取实体DisplayAttribute特性自动自动生成列名

一、目的&#xff1a;通过重写DataGrid的OnAutoGeneratingColumn方法实现根据定义特性自动生成列头信息功能 二、实现 <DataGrid ItemsSource"{local:GetStudents Count50}"/>实体定义如下 public class Student{[DataGridColumn("*")][Display(Na…

three.js开发3D地图记录(一)

关键代码部分&#xff1a; <template><div class"center-map-box" id"contant"></div> </template><script> import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/control…

夏季河湖防溺水新举措:EasyCVR+AI视频智能监控系统保障水域安全

近日一则新闻引起大众关注&#xff0c;有网友发布视频称&#xff0c;假期在逛西湖时&#xff0c;发现水面上“平躺”漂浮着一名游客在等待救援。在事发3分钟内&#xff0c;沿湖救生员成功将落水游客救到了岸边。 随着夏季的到来&#xff0c;雨水增多&#xff0c;各危险水域水位…

别太小看“静态免杀“

0x01 简述 免杀总体来说可分为两种&#xff0c;静态免杀/动态免杀。往往来说&#xff0c;我们更注重于在内部代码层面实现一些免杀技巧&#xff0c;但在有些时候&#xff0c;动态免杀静态免杀以"打组合拳"的方式效果往往会更出人所料。 当我们的程序生成后&#xf…

CCAA认证人员注册全国统一考试开始报名

备受瞩目的CCAA&#xff08;中国认证认可协会&#xff09;认证人员注册全国统一考试即将拉开报名序幕。 考试基本信息&#xff1a; 1&#xff09;报名网站网址&#xff1a;https://kaoshi.ccaa.org.cn/ 2&#xff09;考试报名系统自2024年6月17日12:00时起面向考生正式开通&…

Apache DolphinScheduler查看版本信息

我找了半天&#xff0c;没有看到版本在哪里。然后我看配置&#xff0c;他要连接数据库&#xff0c;我去他存储数据库的表里面&#xff0c;看到了相关的版本信息。 cd /home/dolphinscheduler/dolphinscheduler/bin/env dolphinscheduler找到了里面的密码 版本是3.1.3

【C++】模板初级

【C】模板初级 泛型编程函数模板函数模板的概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则 类模板类模板格式类模板的实例化 泛型编程 当我们之前了解过函数重载后可以知道&#xff0c;一个程序可以出现同名函数&#xff0c;但参数类型不同。 //整型 voi…

网络安全等级保护制度详解,一文掌握核心要点!

一、等级保护制度发展情况 等级保护制度的法律依据 《计算机信息系统安全保护条例》&#xff08;1994年General Office of the State Council第147号令&#xff09; 公安部主管全国计算机信息系统安全保护工作。 计算机信息系统实行安全等级保护&#xff0c;安全等级的划分…

Python+Selenium自动化测试环境搭建步骤(selenium环境搭建)

一、自动化简介 1.自动化测试概念&#xff1a; 是把以人为驱动的测试转化为机器执行的一种过程&#xff0c;它是一种以程序测试程序的过程 2.自动化测试分类&#xff1a; 一般IT上所说的自动化测试是指功能自动化测试&#xff0c;通过编码的方式用一段程序来测试一个软件的功…

数据预处理之基于统计的(3σ,Z分数,Boxplot箱线图)异常值检测#matlab

基于统计的异常值检测 1.异常值的含义 异常值是指在数据集中偏离大部分数据的数据&#xff0c;使人怀疑这些数据的偏离并非由随机因素产生&#xff0c;而是产生于完全不同的机制。 异常挖掘(outlier mining)问题由两个子问题构成&#xff1a;(1)如何度量异常。(2)如何有效发…

我一直看不明白:“C++会被java/python等这些语言替代”

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 有些程序&#xff0c;是既可以…

【QT5】<重点> IMX6ULL开发板运行QT

目录 1. 安装交叉编译器 2. 命令行交叉编译QT项目 3. 运行该可执行程序 4. 开发板上运行UDP程序与Ubuntu通信 1. 安装交叉编译器 第一步&#xff1a;进入正点原子论坛找到IMX6ULL开发板的资料&#xff0c;下载“开发工具”&#xff0c;将“交叉编译工具”中的fsl-imx-x11-…

Spring中的IOC

IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是Spring框架核心概念之一。它是一种设计原则&#xff0c;用来实现对象的松耦合和依赖管理。在传统的编程中&#xff0c;对象负责创建或查找其依赖对象&#xff0c;而在IOC模式下&#xff0c;这些职责被移…

el-date-picker 有效时间精确到时分秒 且给有效时间添加标记

el-date-picker实现有效日期做标记且时分秒限制选择范围 代码如下&#xff1a; // html部分 <el-date-pickerv-model"dateTime"type"datetime":picker-options"pickerOptions" > </el-date-picker>// js部分 /*** 回放有效日期开始时…

WPF/C#:如何将数据分组显示

WPF Samples中的示例 在WPF Samples中有一个关于Grouping的Demo。 该Demo结构如下&#xff1a; MainWindow.xaml如下&#xff1a; <Window x:Class"Grouping.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x&q…

文心一言 VS 讯飞星火 VS chatgpt (283)-- 算法导论21.2 1题

一、使用链表表示和加权合并启发式策略&#xff0c;写出 MAKE-SET、FIND-SET 和 UNION 操作的伪代码。并指定你在集合对象和表对象中所使用的属性。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在并查集&#xff08;Disjoint Sets&#xff09;或集合合并&…

6.7.29 基于卷积神经网络的乳腺良恶性图像分类

计算机化乳腺癌诊断系统在早期癌症诊断中发挥着重要作用。为此&#xff0c;应用深度学习&#xff0c;利用卷积神经网络 (CNN) 对基于小型乳房 X 线图像分析协会 (mini-MIAS) 数据库的乳房 X 线图像中的异常&#xff08;良性或恶性&#xff09;进行分类。观察准确度、灵敏度和特…

天锐绿盾数据防泄密软件有哪些功能

天锐绿盾数据防泄密软件的功能丰富而全面&#xff0c;旨在从源头上保障企业数据的安全。以下是对其主要功能的归纳和介绍&#xff1a; www.drhchina.com 一、文件加密模块 透明加密&#xff1a;在不影响用户工作流程的前提下&#xff0c;对需要保护的文件进行自动加密处理。文…

unity 打包PC安装包中常见文件的功能

目录 前言 一、打包好的文件 二、常用文件 1.文件夹XXX_Data 2.文件夹MonoBleedingEdge 3.文件夹XXX_Data内部 三、文件的应用 1.如果你替换了一个图片 2.如果你新增了或减少了图片和资源 3.场景中有变动 4.resources代码加载的资源改了 5.如果你代码替换了 四、作…