带头单链表 C++实现
节点定义
带头单链表:我们只需要一个结点指针指向整个链表的第一个节点,这样我们就可以通过next指针访问整个链表内的所有节点
template<class T>
struct ListNode
{T _val;ListNode* _next;ListNode(const T &val):_val(val),_next(nullptr){}
};
这里默认将节点的_next指针设置成nullptr
构造析构函数
成员变量只需要Node* 的头指针即可,这里的_n用来记录整个链表中有几个节点
初始化将_head赋成nullptr 因为开始是空链表
析构:直接遍历链表中的节点,按顺序删除节点即可
template<class T>
class List
{
public:typedef ListNode<T> Node;List(){_head = nullptr;_n = 0;}~List(){Node* cur = _head;while (cur){_head = _head->_next;delete cur;cur = _head;--_n;}_head = nullptr;}private:Node* _head;size_t _n;
};
插入节点
push_back
尾插:首先需要找到最后一个节点的地址,将新节点连到最后一个节点的_next上完成尾插
需要考虑_head 为nullptr的情况,因为 为nullptr时找尾操作会访问野指针!
void push_back(const T& val)
{Node* newnode = new Node(val);if (_head == nullptr){_head = newnode;_n++;}else{Node* cur = _head;while (cur->_next){cur = cur->_next;}cur->_next = newnode;_n++;}
}
push_front
头插:头插不需要找尾,只需要让新节点指向原链表,头节点_head指向新节点即可
注意还需要考虑_head为nullptr的情况
void push_front(const T& val)
{Node* newnode = new Node(val);newnode->_next = _head;_head = newnode;++_n;
}
删除节点
pop_back
这里需要分情况,这里的0个节点的情况作了温柔处理,还可以直接assert暴力处理
有多个节点时,需要找到最后一个节点和最后一个的节点的前一个节点,进行删除操作,并将tailPrev的next指针赋为nullptr
void pop_back(){//①0个节点if (_head == nullptr){return;}//②一个节点if (_head->_next == nullptr){delete _head;_head = nullptr;--_n;return;}//③一个节点以上Node* tail = _head;Node* tailPrev = nullptr;while (tail->_next){tailPrev = tail;tail = tail->_next;} delete tail;tail = nullptr;tailPrev->_next = nullptr;--_n;}
pop_front
头删比尾删简单的多:还是这里的空链表情况进行了温柔处理,还可以assert暴力处理
先将_head指向第二个节点,如果只有一个节点的话恰好就是nullptr,然后直接删除_head之前指向的节点
void pop_front(){if (_head == nullptr){return;}Node* deleteNode = _head;_head = _head->_next;delete deleteNode;deleteNode = nullptr;--_n;}
遍历节点
根据链表的最后一个节点的next指针是空来判断走到了链表的尽头,挨个打印即可
void print()
{Node* cur = _head;while (cur){cout << cur->_val << "->";cur = cur->_next;}cout << "NULL" << endl;cout << "节点数量:" << _n << endl;
}
测试代码
void test1()
{List<int> L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);L1.print();
}void test2()
{List<int>L1;L1.push_front(10);L1.push_front(20);L1.push_front(30);L1.push_front(40);L1.print();L1.pop_back();L1.pop_back();L1.print();
}
void test3()
{List<int>L1;L1.push_front(10);L1.push_front(20);L1.push_front(30);L1.push_front(40);L1.print();L1.pop_front();L1.pop_front();L1.pop_front();L1.pop_front();L1.pop_front();L1.print();
}void test4()
{List<int>L1;L1.push_front(10);L1.push_front(20);L1.push_front(30);L1.push_front(40);L1.print();L1.pop_back();L1.pop_back();L1.pop_back();L1.pop_back();L1.pop_back();L1.pop_back();L1.print();
}
相关文章:

带头单链表 C++实现
节点定义 带头单链表:我们只需要一个结点指针指向整个链表的第一个节点,这样我们就可以通过next指针访问整个链表内的所有节点 template<class T> struct ListNode {T _val;ListNode* _next;ListNode(const T &val):_val(val),_next(nullptr){…...
学习c#第24天 枚举类型
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace enumType { //定义枚举 public enum Week { 星期一, 星期二, 星期三, 星期四, 星期…...
TensorFlow运行bug汇总
1、ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1 解决方案 pip install urllib31.26.15 -i https://pypi.tuna.tsinghua.edu.cn/simple 升级或者降级 (TF2.1) C:\Users\Administrator>pip install urllib31.26.15 -i https://pypi.tuna.tsinghua.edu.cn/sim…...
docker部署调度程序
Dockerfile(构建初始镜像) # python:3.8-slim-buster为精简版的python FROM python:3.8-slim-buster # 1059为组的id,newgroup为组名,1088为用户的id,newuser为新用户 RUN groupadd -g 1059 newgroup && \useradd -g -u 1088 -g newgroup -m newuser USER newuser RUN…...
websocket和http协议的区别
ws(websocket)协议和http协议是两种不同的协议。 http:http是一种用于传输超文本的应用层协议,通常用于web端浏览器和web端服务器之间传输数据。http也是基于tcp的,但是HTTP只能在同一时刻单向发送消息,是一种半双工通信。&#…...

CSS之定位
目录 CSS定位为什么需要定位定位组成定位的叠放顺序拓展 CSS定位 为什么需要定位 浮动可以让多个块级盒子一行没有缝隙排列显示,经常用于横向排列盒子定位则是可以让盒子自由的在某个盒子内移动位置或者固定屏幕中的某个位置,并且可以压住其他盒子 定…...
[IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
解决办法: 安装驱动 下载 ODBC Driver for SQL Server - ODBC Driver for SQL Server | Microsoft Learn...

神经网络复习--神经网络算法模型及BP算法
文章目录 神经网络模型的构成BP神经网络 神经网络模型的构成 三种表示方式: 神经网络的三要素: 具有突触或连接,用权重表示神经元的连接强度具有时空整合功能的输入信号累加器激励函数用于限制神经网络的输出 感知神经网络 BP神经网络 …...

【Java】/*方法的使用-快速总结*/
目录 一、什么是方法 二、方法的定义 三、实参和形参的关系 四、方法重载 五、方法签名 一、什么是方法 Java中的方法可以理解为C语言中的函数,只是换了个名称而已。 二、方法的定义 1. 语法格式: public static 返回类型 方法名 (形参列表) { //方…...
kotlin中协程相关
协程 用同步的方式写出异步的效果协程最重要的是通过非阻塞挂起和恢复实现了异步代码的同步编写方式挂起函数(suspend)不一定就是在子线程中执行的,但是通常在定义挂起函数时都会为它指定其他线程,这样挂起才有意义解决多层嵌套回调 协程不是线程&…...

(自适应手机端)物流运输快递仓储网站模板 - 带三级栏目
(自适应手机端)物流运输快递仓储网站模板 - 带三级栏目PbootCMS内核开发的网站模板,该模板适用于物流运输网站、仓储货运网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;自适应手机端,同一个后台…...

Navicat导出表结构到Excel或Word
文章目录 sql语句复制到excel复制到Word sql语句 SELECTcols.COLUMN_NAME AS 字段,cols.COLUMN_TYPE AS 数据类型,IF(pks.CONSTRAINT_TYPE PRIMARY KEY, YES, NO) AS 是否为主键,IF(idxs.INDEX_NAME IS NOT NULL, YES, NO) AS 是否为索引,cols.IS_NULLABLE AS 是否为空,cols.…...

Golang编译优化——稀疏条件常量传播
文章目录 一、概述二、稀疏条件常量传播2.1 初始化worklist2.2 构建def-use链2.3 更新值的lattice2.4 传播constant值2.5 替换no-constant值 一、概述 常量传播(constant propagation)是一种转换,对于给定的关于某个变量 x x x和一个常量 c …...
人工智能培训讲师咨询叶梓介绍及智能医疗技术与ChatGPT临床应用三日深度培训提纲
1、授课老师简介 叶梓,上海交通大学计算机专业博士毕业,高级工程师。主研方向:数据挖掘、机器学习、人工智能。历任国内知名上市IT企业的AI技术总监、资深技术专家,市级行业大数据平台技术负责人。 长期负责城市信息化智能平台的…...

HCIP(BGP综合实验)--8
一:实验要求 二:实现过程 (一)配置IP地址: AR1: [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [AR1-GigabitEthernet0/0/0]int l0 [AR1-LoopBack0]ip add 172.16.0.1 32 [AR1-LoopBack0]int l1 […...

深入理解C++中的Vector容器:用容器构建高效程序
文章目录 vector介绍vector常用的成员函数有关vector定义的函数vector的迭代器使用vector关于空间操作的成员函数vector的增删查改 总结 vector介绍 在C语言的库中包含有公共数据结构的实现,C的这个部分内容就是众所周知的STL(标准模版库)&a…...
目标检测YOLO实战应用案例100讲-基于深度学习的交通场景多尺度目标检测算法研究与应用(下)
目录 3.2 基于空洞卷积的特征融合模块设计 3.3 改进k-means聚类算法的anchor尺寸优化设计...
react 类组件 和 函数组件 声明周期 对比
React 的类组件和函数组件在生命周期方面存在一些差异。以下是它们之间的对比: 类组件的生命周期 React 类组件的生命周期可以分为三个阶段:挂载、更新和卸载。 1、挂载阶段: constructor():组件实例化时调用,用于…...

智慧变电站守护者:TSINGSEE青犀AI视频智能管理系统引领行业革新
一、方案概述 随着科技的不断进步,人工智能(AI)技术已经深入到各个领域。在变电站安全监控领域,引入AI视频监控智能分析系统,可以实现对站内环境、设备状态的实时监控与智能分析,从而提高变电站的安全运行…...

【Ubuntu20.04安装java-8-openjdk】
1 下载 官网下载链接: https://www.oracle.com/java/technologies/downloads/#java8 下载 最后一行 jdk-8u411-linux-x64.tar.gz,并解压: tar -zxvf jdk-8u411-linux-x64.tar.gz2 环境配置 1、打开~/.bashrc文件 sudo gedit ~/.bashrc2、…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...