卡码网语言基础课 |链表的基础操作III

卡码网语言基础课 |链表的基础操作III

  • 链表的插入操作
  • 链表的删除操作
  • 打印链表
  • 代码编写

链表的插入操作

  • 找到要插入的位置的前一个位置,将其命名为cur,将要插入的位置的下一个节点命名为tmp,他们之间的关系是cur -> next = tmp
  • 创建一个链表newNode,将curnext指针指向newNode,即cur -> next = nowNode
  • newNodenext指针指向tmp,即newNode -> next = tmp

转换为代码如下:

// 创建了一个新的 ListNode 结构的节点,值为x, 并将其地址赋给指针 newNode
ListNode *newNode = new ListNode(x);
// 创建了一个名为 tmp 的指针,临时存储当前节点 cur 的下一个节点的地址。
ListNode *tmp = cur -> next;
// 将当前节点 cur 的 next 指针更新为指向新节点 newNode,将新节点插入到当前节点后面。
cur -> next = newNode;
// 将新节点 newNode 的 next 指针设置为指向之前临时存储的节点 tmp
newNode -> nxet = tmp

链表的删除操作

找到删除节点的前一个节点cur,并将其next指针设置为指向当前节点的下下个节点。

转换为代码如下:

cur -> next = cur -> next -> next;

打印链表

在函数内部定义一个指针cur,初始时指向链表的头节点head

cur的的下一个节点不存在时(cur -> next = NULL)说明下一个节点为空节点,即链表的末尾

while (cur -> next != NULL) {
}

在循环体内打印当前节点cur的下一个节点(cur -> next)的值(val)。随后将cur更新为指向链表的下一个节点,以便在下一次循环中打印下一个节点的值。

while (cur -> next != NULL) {cout << cur -> next -> val << " ";cur = cur -> next;
}

循环体结束时,表示已经遍历完了整个链表。最后打印一个换行符,用于分隔不同的输出行。

void printfLinkList(ListNode *head) {ListNode *cur = head;while (cur -> next != NULL) {cout << cur -> next -> val << " ";cur = cur -> next;}cout << endl;
}

代码编写

代码的基础结构以及定义链表的结构体如下:

#include <iostream>
using namespace std;struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(nullptr) {}
};int main() {}

首先需要接收整数 k ,表示需要构建链表的长度:

int main () {int k, val;cin >> k;
}

然后我们需要构建一个长度为 k 的链表,同时记得创建虚拟头节点以及初始化一个指针cur指向它,方便后续节点的接入

ListNode *dummyHead = new ListNode(0);
ListNode *cur = dummyHead;
for (int i = 0; i < k; i++){cin >> val;ListNode *newNode = new ListNode(val);cur -> next = newNode;cur = cur -> next;
}

之后需要接收一个整数s表示s行输入,每行两个整数,第一个整数为 n,第二个整数为x,代表在链表的第n个位置插入x。

int s, n, x;
cin >> s;
while (s--) {cin >> n >> x;
}

当插入的位置n是一个小于等于0的数或者n大于链表的长度时,插入位置不合法。

需要注意,在插入后链表的长度会变化,所以我们需要提前定义一个变量listLen指代链表的长度

int listen = k;if (n <= 0 || n > listLen) {cout << "Insertion position is invalid" << endl;continue;
}

如果不满足上面的条件,说明插入的位置合法,后续执行的操作是完成插入以及打印链表。

插入链表节点只需要找到插入位置的前一个节点即可,也就是第n - 1个节点,从虚拟头节点开始遍历,需要走n - 1步。

cur = dummyHead;
for (int i = 1; i < listLen; i++) {cur = cur -> next;
}

插入链表后需要将链表的长度 + 1:

// 插入节点
ListNode *newNode = new ListNode(x); // 构造一个新的节点
ListNode *tmp = cur -> next;
cur -> next = newNode;
newNode -> next = tmp;// 链表长度加1
listLen++;

随后打印链表即可:

printLinkList(dummyHead);

链表节点删除的前置步骤类型,需要接收一个整数L,表示后续会有L行输入,每行一个整数m,代表删除链表中的第 m 个元素:

int l, m;
cin >> l;
while (l--) {cin >> m;
}

判断是否是非法输入

if (m <= 0 || m > listLen) [cout << "Deletion position is invalid." << endl;continue;
]

找到要删除节点的前一个节点

cur = dummyHead;
for (int i = 1; i < m; i++) cur = cur -> next;
cur -> next = cur -> next -> next;
listLen--;
if (listLen != 0) printLinklist(dummyHead);

完整代码如下:

#include <iostream>
using namespace std;struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(nullptr) {}
};// 打印链表
void printLinklist(ListNode* dummyHead) {ListNode* cur = dummyHead;while (cur->next != NULL) {cout << cur->next->val << " ";cur = cur -> next;}cout << endl;
}
int main() {int k, val;ListNode* dummyHead = new ListNode(0); // 创建了一个虚拟头结点cin >> k;int listLen = k; //记录链表长度,用来控制非法输入输出// 定义一个指向当前节点的指针 cur,初始指向虚拟头结点ListNode* cur = dummyHead; for (int i = 0; i < k; i++) { // 或者使用while(n--)cin >> val;ListNode* newNode = new ListNode(val); // 构造一个新的节点cur -> next = newNode; // 将新节点接入链表cur = cur -> next;      // cur 指向下一个节点}// 增加节点int s, n, x;cin >> s;while (s--) {cin >> n >> x;if (n <= 0 || n > listLen) { // 当要插入的位置非法时cout << "Insertion position is invalid." << endl;continue;}// 指针重新指向虚拟头结点,准备用cur遍历链表cur = dummyHead;// 寻找添加节点的位置,i从1开始,因为节点计数从1开始for (int i = 1; i < n; i++) cur = cur->next;// 插入节点ListNode* newNode = new ListNode(x); // 构造一个新的节点ListNode* tmp = cur ->next;cur->next = newNode;newNode->next = tmp;// 链表长度加1listLen++;// 打印链表printLinklist(dummyHead);}// 删除节点int l,m;cin >> l;while (l--) {cin >> m;if (m <= 0 || m > listLen) {cout << "Deletion position is invalid." << endl;continue;}// 指针重新指向虚拟头结点,准备用cur遍历链表cur = dummyHead;//开始寻找删除节点的位置,i从1开始,因为节点计数从1开始for (int i = 1; i < m; i++) cur = cur->next;// 删除节点cur->next = cur->next->next;listLen--; // 链表长度减一// 如果删除节点后链表为空则不打印if (listLen != 0) printLinklist(dummyHead);}
}

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

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

相关文章

石原子科技亮相2023成都市信息领域新产品发布会

2023年11月13日至15日&#xff0c;由成都市互联网信息办公室、四川天府新区管委会、成都市经信局市新经济委、成都市农业农村局指导的以“信息创造价值 创新引领未来”为主题的成都市信息领域新产品发布会在科创生态岛1号馆举行。围绕人工智能、区块链、数字化绿色化、数字乡村…

iOS性能优化

了解屏幕成像的原理。 有一个电子枪然后在很多横轴方向上 发射电子&#xff0c;不同横轴的电子枪根据显示器中的硬件时钟产生一系列的定时信号&#xff0c;以此来让电子以不同的时间发射出去 这些电子一瞬间的运动形成了一帧动画。 CPU优化&#xff1a; 1.文本计算优化 如果一…

Unity Meta Quest 一体机开发(六):HandGrabInteractor 和 HandGrabInteractable 知识点

文章目录 &#x1f4d5;教程说明&#x1f4d5;HandGrabInteractor⭐HandGrabAPI⭐HandWristPoint⭐GripPoint⭐PinchPoint⭐PinchArea⭐HandGrabVisual⭐HandGrabGlow &#x1f4d5;HandGrabInteractable⭐Support Grab Type⭐Pinch Grab Rules 和 Palm Grab Rules⭐Unselect M…

BMS系统项目

1、通过电压监测是否冲满&#xff0c;通过电压可以监测是否放完电 电池得参数 单体过压&#xff08;充满电&#xff09; 过压恢复&#xff08;百分之90多&#xff09; 欠压保护&#xff08;百分之几得电&#xff0c;快关机了&#xff09; 欠压恢复&#xff08;就是欠压之上…

C#中.NET 6.0 Windows窗体应用通过EF访问数据库并对数据库追加、删除记录

目录 一、应用程序设计 二、应用程序源码 三、生成效果 前文作者发布了在.NET 6.0 控制台应用中通过EF访问已有数据库&#xff0c;事实上&#xff0c;在.NET 6.0 Windows窗体应用中通过EF访问已有数据库也是一样的。操作方法基本一样&#xff0c;数据库EF模型和上下文都是自…

EV代码签名证书

为了增强软件的安全性和可信度&#xff0c;EV代码签名证书&#xff08;Extended Validation Code Signing Certificate&#xff09;成为了一种具有最高级别保障的关键工具。 EV代码签名证书是一种由受信任的证书颁发机构&#xff08;CA&#xff09;或证书供应商提供的高级别代…

QToolBar详解

QToolBar 是 Qt 框架中用于创建工具栏的类&#xff0c;它提供了一种方便的方式来组织和展示工具按钮、工具部件等。工具栏通常用于提供对应用程序功能的快速访问。 QToolBar 的基本用法&#xff1a; 创建工具栏&#xff1a; QToolBar *toolbar new QToolBar("MyToolbar&…

Harmony SDK API 版本 与 Harmony OS 版本对照表,及如何查看鸿蒙手机Harmony SDK Api 版本

Harmony SDK API 版本 与 Harmony OS 版本对照表 Harmony OSHarmony SDK APIHarmony 4.09Harmony 3.19Harmony 3.08Harmony 3.0 pre7Harmony 2.2.06Harmony 2.1.05Harmony 2.04 具体到真机上可能会有差异&#xff0c;如我的手机OS版本是2.0&#xff0c;按照上面表应该是4&…

2023数维杯国际数学建模A题B题C题D题思路+模型+代码+完整论文

目录 1.数维杯各题思路模型&#xff1a;比赛开始后&#xff0c;第一时间更新&#xff0c;获取见文末名片 3 常见数模问题常见模型分类 3.1 分类问题 3.2 优化问题 详细思路见此名片&#xff0c;开赛第一时间更新 1.数维杯各题思路模型&#xff1a;9.7晚上比赛开始后&#x…

QML20、布局

1.概述 首先,QML同样允许大家使用硬编码的方式将位置数值直接写到代码中,但是这样做首先难以适应UI的调整,其次代码维护起来也很困难。因此不推荐这样做。推荐大家使用的是以下三种布局管理器:Row,、Column、Grid、Flow,以及使用Anchor进行布局。 2.Row QML 中的 Row 元素…

[IJKPLAYER]基于DEMO分析IJKPLAYER(整理版本)

背景 博主主要是从事C语言开发&#xff0c;因此本文着重强调FFMPEG部分&#xff0c;关于JAVA应用和框架层只是一笔带过。IJKPLAYER的实质是对FFMPEG项目中的ffplayer程序进行的二次封装&#xff0c;通过JNI方式完成对外提供JAVA接口。 1.目录结构 activities:包含了demo的所有…

二十三种设计模式全面解析-迭代器模式进阶篇:探索变体与扩展

在前文中&#xff0c;我们深入探讨了迭代器模式的概念、原理和基本应用。然而&#xff0c;迭代器模式并不止于此&#xff0c;它还有更多的变体和扩展&#xff0c;为我们提供了更多灵活的遍历方式和功能。今天&#xff0c;我将继续带领你进入迭代器模式的进阶篇&#xff0c;探索…

【电路】MOS管开关电路

目录 简介&#xff1a; MOS管导通特性 应用实例&#xff1a; MOS管的作用-开关 更好的理解方式&#xff1a; 仿真&#xff1a; 简介&#xff1a; MOS管也就是常说的场效应管&#xff08;FET&#xff09;&#xff0c;有结型场效应管、绝缘栅型场效应管&#xff08;又分为…

认知升级:模型与范式转换

你好&#xff0c;我是 EarlGrey&#xff0c;一名双语学习者&#xff0c;会一点编程&#xff0c;目前已翻译出版《Python 无师自通》、《Python 并行编程手册》等书籍。 点击上方蓝字关注我&#xff0c;持续获取编程干货、好书推荐和高效工具分享&#xff0c;一起提升认知和思维…

LeetCode - 141. 环形链表 (C语言,快慢指针,配图)

141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 1. 什么是快慢指针 这里我们我们将介绍环形链表的经典解法——快慢指针&#xff0c;简单理解&#xff0c;指针移动快的叫做快指针fast&#xff0c;移动速度慢的叫慢指针slow。一般我们设快指针走两步&#xff0c;慢指针走…

多种方法实现conda环境迁移

Conda 为包管理器和虚拟环境管理器。在配置完项目环境&#xff0c;进行了编写和测试代码&#xff0c;需要大量数据测试运行时&#xff0c;需要将其移至另一台主机上。Conda 提供了多种保存和移动环境的方法。 方法1&#xff1a; scp拷贝法&#xff0c;直接将envs的环境文件夹…

RSS订阅快速连接Notion

数环通让您可以通过不到几分钟的时间即可实现RSS订阅与Notion的对接与集成&#xff0c;从而高效实现工作流程自动化&#xff0c;降本增效&#xff01; 1.产品介绍 RSS订阅是数环通的内置应用&#xff0c;很多用户通过RSS订阅来收集自己在各大平台上看的内容&#xff0c;当RSS…

【Mycat2实战】三、Mycat实现读写分离

1. 无聊的理论知识 什么是读写分离 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff0c; 而从数据库处理查询操作。 为什么使用读写分离 从集中到分布&#xff0c;最基本的一个需求不是数据存储的瓶颈&#xff0c;而是在于计算的瓶颈&#xff…

6.11.面图层(Polygon)

愿你出走半生,归来仍是少年&#xff01; 通过面图层可实现一个面的绘制&#xff0c;该面可包含多个孔洞。 1.构造 Polygon()Polygon(MapView mapView) 2. 顶点管理 voidsetPoints(List<GeoPoint> points)voidaddPoint(GeoPoint p)List<GeoPoint>getPoints() 通…

Python算法——树的直径

Python中的树的直径算法详解 树的直径是树中任意两个节点之间最长路径的长度。在本文中&#xff0c;我们将深入讨论树的直径问题以及如何通过深度优先搜索&#xff08;DFS&#xff09;算法来解决。我们将提供Python代码实现&#xff0c;并详细说明算法的原理和步骤。 树的直径…