当前位置: 首页 > news >正文

【C++语言】卡码网语言基础课系列----13. 链表的基础操作I

文章目录

  • 背景知识
    • 链表
      • 1、虚拟头节点(dummyNode)
      • 2、定义链表节点
      • 3、链表的插入
  • 练习题目
    • 链表的基础操作I
    • 具体代码实现
  • 小白寄语
    • 诗词共勉

背景知识

链表

与数组不同,链表的元素存储可以是连续的,也可以是不连续的,每个数据除了存储本身的信息(data数据域)之外,还存储一个指示着下一个元素的地址的信息(next指针域),给人的感受就好像这些元素是通过一条“链”串起来的。
链表的第一个节点的存储位置被称为头指针,然后通过next指针域找到下一个节点,直到找到最后一个节点,最后一个节点的next指针域并不存在,也就是“空”的,在C++中,用null来表示这个空指针。

1、虚拟头节点(dummyNode)

为了简化链表的插入和删除操作,我们经常在链表的第一个节点前添加一个节点,称为虚拟头节点(dummyNode),头节点的数据域可以是空的,但是指针域指向第一个节点的指针。

头指针是链表指向第一个节点的指针,访问链表的入口,经常使用头指针表示链表,头指针是链表必须的
头节点是为了方便操作添加的,不存储实际数据,头节点不一定是链表必须的

2、定义链表节点

下面的完整代码定义了一个名为ListNode的结构体,用于表示链表中的一个节点,包含存储节点数据的数据域和存储下一个节点地址的指针域。

// 链表节点结构体
struct ListNode {int val;  // 存储节点的数据ListNode *next; // 指向下一个节点的指针	// 构造函数,用于初始化节点, x接收数据作为数据域,next(nullptr)表示next指针为空ListNode(int x) : val(x), next(nullptr) {}
};

这里的ListNode(int x)表示定义一个接收整数参数 x的名称为ListNode的构造函数(名称和结构体相同)
,:表示初始化列表的开始,val(x)表示链表数据域的值被初始化为传递的参数 x ,next(nullptr)则表示
next指针被初始化为nullptr,表示没有下一个节点。

3、链表的插入

链表的插入至少应该包括以下操作:
1)创建一个新的链表节点,初始化它的值为val
2)将新的节点放入到链表的尾部,接入链表,也就是当前链表的尾部的next指向新节点
3)新接入的链表节点变为链表的尾部

ListNode *newNode = new ListNode(val); // 通过new构造一个新的节点,节点的值为val
cur -> next = newNode; // cur节点的next节点是新节点,从而将新节点接入链表
cur = cur -> next;      // 新插入的节点变更为新的尾节点,即cur发生了变更

练习题目

链表的基础操作I

题目描述

构建一个单向链表,链表中包含一组整数数据。输出链表中的所有元素。
要求:

  1. 使用自定义的链表数据结构
  2. 提供一个 linkedList 类来管理链表,包含构建链表和输出链表元素的方法
  3. 在 main 函数中,创建一个包含一组整数数据的链表,然后调用链表的输出方法将所有元素打印出来

输入描述

包含多组测试数据,输入直到文件尾结束。
每组的第一行包含一个整数 n,表示需要构建的链表的长度。
接下来一行包含 n 个整数,表示链表中的元素。

输出描述

每组测试数据输出占一行。
按照顺序打印出链表中的元素,每个元素后面跟一个空格。

输入示例

5
1 2 3 4 5
6
3 4 5 6 7 8

输出示例

1 2 3 4 5
3 4 5 6 7 8

提示

数据范围:
1 <= n <= 1000;

具体代码实现

#include <iostream>
using namespace std;typedef struct ListNode {int val; // 元素值ListNode *next; ListNode(int x) : val(x), next(nullptr) {} // 通过构造函数进行初始化
}ListNode;int main()
{int n;ListNode *dummyNode = new ListNode(0); // 创建哑节点,用于标志链表头while (cin >> n) {int val; // 用于接收链表元素值ListNode *cur = dummyNode; // 创建临时节点,指向哑节点while (n--) {cin >> val;ListNode *newNode = new ListNode(val); // 创建新节点cur->next = newNode; // 当前节点的下一个节点,指向新节点cur = cur->next; // 将新节点作为当前节点}cur = dummyNode; // 将临时节点,再次指向哑节点,用于遍历链表while (cur->next != nullptr) {cout << cur->next->val << " ";cur = cur->next;}cout << endl;}return 0;
}

小白寄语

扎根,做好手头的事,精进。

诗词共勉

人生若只如初见,何事秋风悲画扇。
等闲变却故人心,却道故人心易变。
-----------纳兰性德

http://www.lryc.cn/news/530326.html

相关文章:

  • Vue.js组件开发-实现图片浮动效果
  • 自制Windows系统(十一、Windows11GUI)
  • 索罗斯的“反身性”(Reflexivity)理论:市场如何扭曲现实?(中英双语)
  • 力扣257. 二叉树的所有路径(遍历思想解决)
  • 使用朴素贝叶斯对散点数据进行分类
  • 如何实现滑动列表功能
  • 计算机网络一点事(22)
  • C# 语言基础全面解析
  • [原创](Modern C++)现代C++的关键性概念: 流格式化
  • 《数据可视化新高度:Graphy的AI协作变革》
  • C++并发:设计无锁数据结构
  • 蓝桥杯刷题DAY2:二维前缀和 一维前缀和 差分数组
  • 雷电等基于VirtualBox的Android模拟器映射串口和测试CSerialPort串口功能
  • 四、jQuery笔记
  • 流浪 Linux: 外置 USB SSD 安装 ArchLinux
  • 1.For New TFLite Beginner
  • 吊打同类软件免费又可批量使用
  • MiniMind——跑通项目
  • 单细胞-第五节 多样本数据分析,打分R包AUCell
  • 【零拷贝】
  • 深入解析 C++ 字符串处理:提取和分割的多种方法
  • 计算机组成原理——存储系统(一)
  • Jenkins未在第一次登录后设置用户名,第二次登录不进去怎么办?
  • 论文和代码解读:RF-Inversion 图像/视频编辑技术
  • 大模型培训讲师老师叶梓分享:DeepSeek多模态大模型janus初探
  • 2025最新源支付V7全套开源版+Mac云端+五合一云端
  • 稀疏混合专家架构语言模型(MoE)
  • 比较热门的嵌入式项目
  • 牛客网 除2!(详解)c++
  • 被裁与人生的意义--春节随想