C++手撕单链表及逆序打印
在学习数据结构的过程中,链表是一个非常重要的基础数据结构。今天,我们将通过C++手动实现一个单链表,并添加一个逆序打印的功能,帮助大家更好地理解链表的实现和操作。
一、链表简介
链表是一种线性数据结构,其中每个元素(称为节点)包含数据部分和指向下一个节点的指针。与数组不同,链表的内存空间是动态分配的,因此可以灵活地插入和删除节点,而不需要移动其他元素。
单链表是最简单的链表形式,每个节点只有一个指向下一个节点的指针。
二、单链表的实现
1. 定义链表节点
我们首先定义链表节点的结构。每个节点包含一个整数值和一个指向下一个节点的指针。
#include <iostream>
using namespace std;// 定义链表节点结构
struct ListNode {int val; // 节点存储的数据ListNode* next; // 指向下一个节点的指针// 构造函数ListNode(int x) : val(x), next(nullptr) {}
};
2. 定义链表类
接下来,我们定义一个链表类,包含链表的基本操作,如插入、删除和遍历。
class LinkedList {
private:ListNode* head; // 链表的头指针public:// 构造函数LinkedList() : head(nullptr) {}// 析构函数,释放链表内存~LinkedList() {ListNode* current = head;while (current != nullptr) {ListNode* temp = current;current = current->next;delete temp;}}// 插入节点到链表头部void insertAtHead(int value) {ListNode* newNode = new ListNode(value);newNode->next = head;head = newNode;}// 插入节点到链表尾部void insertAtTail(int value) {ListNode* newNode = new ListNode(value);if (head == nullptr) {head = newNode;return;}ListNode* current = head;while (current->next != nullptr) {current = current->next;}current->next = newNode;}// 删除节点void deleteNode(int value) {if (head == nullptr) return; // 链表为空if (head->val == value) {ListNode* temp = head;head = head->next;delete temp;return;}ListNode* current = head;while (current->next != nullptr && current->next->val != value) {current = current->next;}if (current->next != nullptr) {ListNode* temp = current->next;current->next = current->next->next;delete temp;}}// 打印链表void printList() {ListNode* current = head;while (current != nullptr) {cout << current->val << " -> ";current = current->next;}cout << "nullptr" << endl;}// 逆序打印链表void reversePrint(ListNode* node) {if (node == nullptr) return;reversePrint(node->next);cout << node->val << " ";}// 调用逆序打印void reversePrint() {reversePrint(head);cout << endl;}
};
3. 测试链表
我们编写一个简单的测试程序来验证链表的功能,包括插入、删除、正序打印和逆序打印。
int main() {LinkedList list;// 插入节点list.insertAtHead(3);list.insertAtHead(2);list.insertAtHead(1);list.insertAtTail(4);list.insertAtTail(5);// 打印链表cout << "链表内容: ";list.printList();// 逆序打印链表cout << "逆序打印链表: ";list.reversePrint();// 删除节点list.deleteNode(3);cout << "删除节点 3 后的链表: ";list.printList();// 删除头节点list.deleteNode(1);cout << "删除头节点后的链表: ";list.printList();return 0;
}
4. 输出示例
运行上述代码后,输出如下:
链表内容: 1 -> 2 -> 3 -> 4 -> 5 -> nullptr
逆序打印链表: 5 4 3 2 1
删除节点 3 后的链表: 1 -> 2 -> 4 -> 5 -> nullptr
删除头节点后的链表: 2 -> 4 -> 5 -> nullptr
三、逆序打印的实现
逆序打印链表的关键在于递归。我们定义了一个递归函数 reversePrint,它先递归到链表的尾部,然后在回溯过程中打印每个节点的值。这种方法利用了递归的调用栈,自然地实现了逆序打印。
逆序打印函数
void reversePrint(ListNode* node) {if (node == nullptr) return;reversePrint(node->next);cout << node->val << " ";
}
调用逆序打印
void reversePrint() {reversePrint(head);cout << endl;
}
四、总结
通过手动实现单链表,我们不仅加深了对链表数据结构的理解,还学会了如何操作链表节点,包括插入、删除和遍历。此外,逆序打印功能的实现进一步展示了递归在链表操作中的强大作用。
相关文章:
C++手撕单链表及逆序打印
在学习数据结构的过程中,链表是一个非常重要的基础数据结构。今天,我们将通过C手动实现一个单链表,并添加一个逆序打印的功能,帮助大家更好地理解链表的实现和操作。 一、链表简介 链表是一种线性数据结构,其中每个元…...
996引擎-疑难杂症:Ctrl + F9 编辑好的UI进入游戏查看却是歪的
Ctrl F9 编辑好UI后,进入游戏查看却是歪的。 检查Ctrl F10 是否有做过编辑。可以找到对应界面执行【清空】...
JQuery初步学习
文章目录 一、前言二、概述2.1 介绍2.2 安装 三、语法3.1 文档就绪3.2 选择器 四、事件4.1 概述4.2 事件绑定/解绑4.3 一次性事件4.4 事件委托4.5 自定义事件 五、效果5.1 隐藏/显示5.2 淡入淡出5.3 滑动5.4 动画 六、链七、HTML7.1 内容/属性7.2 元素操作7.3 类属性7.4 样式属…...
repo仓库文件清理
1. repo 仓库内文件清理 # 清理所有Git仓库中的项目 repo forall -c git clean -dfx # 重置所有Git 仓库中的项目 repo forall -c git reset --hard 解释: repo forall -c git clean -dfx: repo forall 是一个用于在所有项目中执行命令的工具。-c 后…...
使用Docker部署Java项目的完整指南
前言 Docker是一个轻量级的容器化平台,可将应用及其依赖打包成标准化单元,实现快速部署和环境隔离。本文以Spring Boot项目为例,演示如何通过Dockerfile部署Java应用。 准备工作 本地环境 安装Docker Desktop(官网下载࿰…...
基于 Spring Boot 瑞吉外卖系统开发(三)
基于 Spring Boot 瑞吉外卖系统开发(三) 分类列表 静态页面 实现功能所需要的接口 定义Mapper接口 Mapper public interface CategoryMapper extends BaseMapper<Category> {}定义Service接口 public interface CategoryService extends ISe…...
TCP,UDP协议和域名地址
1.TCP(传输控制协议)是面向连接,UDP(用户数据报协议)是无连接的 2.应用层:FTP,HTTP,SMTP,TELNET,DNS,TFTP 传输层;TCP,UDP 网际层:IP,ICMP,ARP,RARP 3.TCP21:20端口数据传输;21端…...
winserver2022备份
安装备份,然后等待安装完成即可 然后可以在这里看到安装好的win server2022备份 一直下一步然后到这里 不要用本地文件夹备份 备份到远程服务器,远程服务器路径 然后确定备份即可 如何恢复呢? 点击右侧的恢复就可以了 打开任务计划程序 这…...
GAT-GRAPH ATTENTION NETWORKS(论文笔记)
CCF等级:A 发布时间:2018年 代码位置 25年4月21日交 目录 一、简介 二、原理 1.注意力系数 2.归一化 3.特征组合与非线性变换 4.多头注意力 4.1特征拼接操作 4.2平均池化操作 三、实验性能 四、结论和未来工作 一、简介 图注意力网络&…...
SpringBoot和微服务学习记录Day1
分布式架构 为了解决大量的用户请求,需要多台服务器,为处理某些请求将一些服务器划分为一个集群,通过一种技术来处理集群的请求 典型应用: nginx:Tomcat集群 Redis:哨兵模式 MySQL:mycat 微…...
PDFBox/Itext5渲染生成pdf文档
目录 PDFBox最终效果实现代码 Itext5最终效果实现代码 PDFBox 使用PDFBox可以渲染生成pdf文档,并且自定义程度高,只是比较麻烦,pdf的内容位置都需要手动设置x(横向)和y(纵向)绝对位置ÿ…...
前端获取不到后端新加的字段 解决方案
前端获取不到后端新加的字段 解决方案 sql 返回的是 FileInfo 对象 private String lastUpdateTimeStr;// 自定义 setLastUpdateTime 方法,确保在设置 lastUpdateTime 时自动格式化为字符串public void setLastUpdateTime(LocalDateTime lastUpdateTime) {this.las…...
【Java学习】AI时代下如何学习Java语言开发
学习 Java 语言开发时,合理借助 AI 工具可以提升效率、深化理解,以下是具体的学习策略和方法: 一、利用 AI 辅助基础学习 1. 智能文档解读与语法解析 工具:ChatGPT、Bing Chat、Google Bard用法: 直接提问基础语法问…...
联想拯救者Y9000K重装Ubuntu系统
USB刻录Ubuntu,并插入电脑。 进入官网https://rufus.ie/downloads/,安装4.0p版本,对应Ubuntu 22.04版本进入官网https://www.releases.ubuntu.com/22.04/,下载Ubuntu 22.04的iso文件插入一个空USB。运行rufus.exe,选择…...
罗技K860键盘
罗技蓝牙键盘的顶部功能键F1-F12的原本功能 单击罗技键盘的功能键时,默认响应的是键盘上面显示的快进、调节音量等功能。改变回F1~F12原本功能,同时按下 fn和esc组合键...
PyTorch Tensor维度变换实战:view/squeeze/expand/repeat全解析
本文从图像数据处理、模型输入适配等实际场景出发,系统讲解PyTorch中view、squeeze、expand和repeat四大维度变换方法。通过代码演示对比不同方法的适用性,助您掌握数据维度调整的核心技巧。 一、基础维度操作方法 1. view:内存连续的形状重…...
【NLP 面经 9、逐层分解Transformer】
目录 一、Transformer 整体结构 1.Tranformer的整体结构 2.Transformer的工作流程 二、Transformer的输入 1.单词 Embedding 2.位置 Embedding 计算公式: 三、Self-Attention 自注意力机制 1.Self-Attention 结构 编辑 2.Q、K、V的计算 代码实现 3.Self-Attenti…...
【线程有哪些状态?这些状态如何相互转换?阻塞和等待的状态有什么区别?】
线程状态及其转换与区别 线程的生命周期包含多个状态,不同状态之间的转换由线程调度和同步机制决定。以下是线程状态的详细说明、转换关系及阻塞与等待的区别: 一、线程的六种基本状态(以Java为例) 状态描述NEW(新建…...
netty中的ChannelPipeline详解
Netty中的ChannelPipeline是事件处理链的核心组件,负责将多个ChannelHandler组织成有序的责任链,实现网络事件(如数据读写、连接状态变化)的动态编排和传播。以下从核心机制、执行逻辑到应用场景进行详细解析: 1. 核心结构与组成 双向链表结构 组成单元:ChannelPipeline…...
Ubuntu 24.04 中文输入法安装
搜狗输入法,在Ubuntu 24.04上使用失败,安装教程如下 https://shurufa.sogou.com/linux/guide 出现问题的情况,是这个帖子里描述的: https://forum.ubuntu.org.cn/viewtopic.php?t493893 后面通过google拼音输入法解决了&#x…...
踩雷,前端一直卡在获取token中
问题:一直卡在var token SecureStorage.Default.GetAsync("auth_token").Result; public VideoService(){_httpClient new HttpClient();var token SecureStorage.Default.GetAsync("auth_token");} 这是一个典型的同步等待异步操作导致的死…...
这是一个文章标题
# Markdown 全语法示例手册本文档将全面演示 Markdown 的语法元素,包含 **标题**、**列表**、**代码块**、**表格**、**数学公式** 等 18 种核心功能。所有示例均附带实际应用场景说明。---## 一、基础文本格式### 1.1 标题层级 markdown # H1 (使用 #) ## H2 (使用…...
xtrabackup备份
安装: https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-30/binary/tarball/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz?_gl1*1ud2oby*_gcl_au*MTMyODM4NTk1NS4xNzM3MjUwNjQ2https://downloads.perc…...
(51单片机)串口通讯(串口通讯教程)(串口接收发送教程)
前言: 今天有两个项目,分别为: 串口接收: 串口发送: 如上图将文件放在Keli5 中即可,然后烧录在单片机中就行了 烧录软件用的是STC-ISP,不知道怎么安装的可以去看江科大的视频: 【51单片机入门…...
redis 延迟双删
Redis延迟双删是一种用于解决缓存与数据库数据一致性问题的策略,通常在高并发场景下使用。以下是其核心内容: 1. 问题背景 当更新数据库时,如果未及时删除或更新缓存,可能导致后续读请求仍从缓存中读取旧数据,造成数…...
大语言模型中的幻觉现象深度解析
一、幻觉的定义及出现的原因 1. 基本定义 幻觉(Hallucination) 指大语言模型在自然语言处理过程中产生的与客观事实或既定输入相悖的响应,主要表现为信息失准与逻辑矛盾。 2. 幻觉类型与机制 2.1 事实性幻觉 定义:生成内容与可验证…...
App的欢迎页,以及启动黑屏的问题
1、在styles.xml文件中配置:<style name"WelcomePageStyle" parent"style/Theme.AppCompat.Light.NoActionBar"><item name"android:windowBackground">mipmap/icon_welcome_bg</item><item name"android:…...
各种颜色空间的相互转换方法(RGB,HSV,CMYK,灰度)
各个颜色空间原始值的取值范围: RGB:[0,255] H:[0,360],S:[0,1],V:[0,1] CMYK:[0,1] 灰度:[0,255] 以下给出各个颜色空间转换的伪代码。 RGB转HSV rR/255 gG/255 b…...
详解如何从零用 Python复现类似 GPT-4o 的多模态模型
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
大模型训练关键两步
大模型的核心原理是基于深度学习,通过多层神经网络进行数据建模和特征提取。目前大部分的大模型采用的是Transformer架构,它采用了自注意力机制,能够处理长距离依赖关系,从而更好地捕捉文本的语义和上下文信息。大模型还结合了预训…...
