卡码网语言基础课 | 15. 链表的基础操作Ⅲ

news2024/12/28 5:18:10

目录

一、 插入链表的过程

二、 删除链表的过程

三、 打印链表

3.1 判断节点是否处于链尾

3.2 打印链表

3.3 循环体结束,遍历打印


题目:

请编写一个程序,实现以下链表操作:构建一个单向链表,链表中包含一组整数数据。 

1. 实现在链表的第 n 个位置插入一个元素,输出整个链表的所有元素。
2. 实现删除链表的第 m 个位置的元素,输出整个链表的所有元素。 

要求: 

1. 使用自定义的链表数据结构。
2. 提供一个 linkedList 类来管理链表,包含构建链表、插入元素、删除元素和输出链表元素的方法。
3. 在 main 函数中,创建一个包含一组整数数据的链表,然后根据输入的 n 和 m,调用链表的方法插入和删除元素,并输出整个链表的所有元素。

一、 插入链表的过程

在链表中,具体插入的过程如下:

  • 找到要插入的位置的前一个节点,将之命名为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的指针更新指向新节点newNode,并将新节点插入到当前节点后面
cur -> next = newNode;

//将新节点newNode的指针设置为指向临时指向节点tmp
newNode -> next = tmp;

二、 删除链表的过程

删除链表则相对简单,只需要找到删除元素的前一个节点cur,并将其指针指向更新为删除元素的下一个节点即可,实现删除操作。具体代码实现如下所示:

//cur表示删除元素的前一个节点名
//cur -> next 表示指针指向当前删除元素
//cur -> next -> next 表示指针指向删除元素的后一个节点

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

三、 打印链表

3.1 判断节点是否处于链尾

当前节点cur的下一节点 cur -> next,如果为NULL,则为链尾。

//判断是否迭代至链尾

while(cur -> next != NULL){

}

3.2 打印链表

在循环体内,打印当前节点(cur)的下一节点(cur -> next)的值(val)。并更新当前节点指向下一个节点。

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

3.3 循环体结束,遍历打印

void printLinklist(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){}
};

//打印链表
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++){
        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; //输入n和x
         if(n <= 0 || n > listLen){
             cout << "Insertion position is invalid." << endl; //输出错误提示
             continue;
         }
   
   
   //指针重新指向虚拟头结点,并准备用cur遍历链表
   cur = dummyHead;
   
   //寻找添加节点的位置,i从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;
   
   //链表长度+i从1
   listLen++;
   
   //打印链表
   printLinklist(dummyHead);
   
   }
   
   //删除节点
    int l, m;  //注意这里为L的小写,不是数字1
    cin >> l;    
   while(l--){
       cin >> m;
       if(m <= 0 || m > listLen){//PS:遗漏<0
           cout << "Deletion position is invalid." << endl;
           continue;
       }
       
       //指针重新指向虚拟头结点
       cur = dummyHead;
       
       //开始寻找删除节点位置,i从1开始,因节点计数从1开始
       for(int i = 1; i < m; i++) cur = cur -> next;
       
       //删除节点 
       cur -> next = cur -> next -> next;
       
       listLen--; //链表长度-1
       
       //如果删除节点后链表为空则不打印
       if(listLen != 0) printLinklist(dummyHead);
   }
   
}


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

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

相关文章

c++没有返回值的返回值

上面的函数search没有返回值,因为a不等于1,但是输出的时候会输出6.这恰巧是x的值,如果我们希望a不等于1时返回x,那么这种结果反而是正确的.有时候这种错误的代码可能产生正确的结果反而会加大debug难度 int search(int n) { 00007FF66DB723E0 mov dword ptr [rsp8],e…

【Linux系统编程】进程概念详解(什么是进程?如何查看进程?)

目录 一、前言 二、 什么是进程&#xff1f; &#x1f4a6;引出进程 &#x1f4a6;进程的基本概念 &#x1f4a6;理解进程 ⭐描述进程--PCB&#xff08;进程控制块&#xff09; ⭐组织进程 三、查看进程 &#x1f4a6; 通过 ps 命令查看进程 &#x1f4a6; 通过 l…

事件代理?

1.什么是事件代理&#xff1f; 事件代理也叫事件委托&#xff0c;只指定一个事件处理程序&#xff0c;就可以管理某一类型得事件。 可以简单理解为&#xff0c;事件代理就是将本应该绑定子元素事件绑定给父元素代理。它的优点就是&#xff1a;减少事件得执行&#xff0c;减少浏…

2023/11/28JAVAweb学习

查找哪个进程占用了该端口号 跳过某一个阶段

欧拉公式推导

欧拉恒等式 函数推导过程(幂级数展开的方式近似&#xff0c;后面用到了三角函数展开的方式) 从导数中推导的方程&#xff0c;对于该函数当x0时为1即初值,导数为自身&#xff1b; 设,当x 0时&#xff0c; 因为函数是收敛的所以会越来越精确&#xff08;引用自MIT公开课&#xf…

激光器温度,波长变化

940&#xff0c;波长变化0.3nm/C

小白必知:AIGC 和 ChatGPT 的区别

原文 &#xff1a; https://openaigptguide.com/chatgpt-aigc-difference/ AIGC 和 ChatGPT 都是人工智能技术&#xff0c;但它们的功能和应用场景不同。 AIGC&#xff08;AI-GeneratedContent&#xff0c;人工智能自动生成内容&#xff09;是人工智能、计算机图形学和深度学…

强烈推荐:零售行业升级教程,现学现用

新零售模式是随着科技的迅猛发展而崭露头角的一种零售业态。在这个数字化时代&#xff0c;消费者的购物习惯和期望正在发生根本性的变化&#xff0c;推动着传统零售业寻找创新的方式来满足不断变化的市场需求。 自动售货机作为新零售模式的一部分&#xff0c;以其高效、便捷、智…

凝聚数字经济发展新力量,四象科技受邀出席2023全球数商大会

11月25日&#xff0c;2023全球数商大会在上海开幕。本届大会以“数联全球、商通未来”为主题&#xff0c;上海市委副书记、市长龚正出席大会并宣布大会开幕&#xff0c;国家发展改革委党组成员&#xff0c;国家数据局党组书记、局长刘烈宏&#xff0c;上海市副市长陈杰致辞。四…

写了个数据查询为空的 Bug,你会怎么办?

大家在开发时&#xff0c;遇到的一个典型的 Bug 就是&#xff1a;为什么数据查询为空&#xff1f; 对应的现象就是&#xff1a;前端展示不出数据、或者后端查询到的数据列表为空。 遇到此类问题&#xff0c;其实是有经典的解决套路的&#xff0c;下面鱼皮给大家分享如何高效解决…

【实验】配置用户通过IPv6方式上网

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【微/信/公/众/号&#xff1a;厦门微思网络】 组网需求 运营商为企业分配了WAN侧的IPv6地址11…

webgoat-Cross Site Scripting XSS 跨站脚本攻击

01 概念 本节课讲述了什么是XSS&#xff0c;并使用XSS执行那些非开发者本意的任务。 目标 了解什么是XSS&#xff0c;XSS如何工作&#xff1f; 学习反射型XSS及注入&#xff0c;基于DOM的XSS注入 02 What is XSS? Cross-Site Scripting也叫XSS是一种漏洞&#xff0c;允许…

ELK日志系统

&#xff08;一&#xff09;ELK 1、elk&#xff1a;是一套完整的日志集中处理方案&#xff0c;由三个开源的软件简称组成 2、E&#xff1a;ElasticSearch&#xff08;ES&#xff09;&#xff0c;是一个开源的&#xff0c;分布式的存储检索引擎&#xff08;索引型的非关系型数…

翻页电子书怎么制作?用简单的方法做出炫酷的效果!

现在很多公司都喜欢把一些内容做成电子书的形式&#xff0c;与传统的纸质文献相比呢&#xff0c;电子书具有存储量大、体积小、成本低、信息更新快、方便阅读等不可替代的优势&#xff0c;受到了越来越多人的喜爱。 如何制作翻页电子书呢&#xff1f;今天小编就专门给大家安利…

内测分发平台是否支持应用的微服务化部署

内测分发平台的微服务化部署支持是现代应用开发和部署的一个重要特性。首先我们得知道什么是微服务化部署都有哪些关键功能&#xff0c;如何实施微服务化的部署。下文以我自己理解总结了几点。 图片来源:news.gulufenfa.com 微服务是一种基于独立运行的小型服务来构建应用程序…

Python读取Ansible playbooks返回信息

一&#xff0e;背景及概要设计 当公司管理维护的服务器到达一定规模后&#xff0c;就必然借助远程自动化运维工具&#xff0c;而ansible是其中备选之一。Ansible基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、chef、func、fabric&#xff09;的优点&#x…

用了这7款html网页制作软件,你会爱上编程!

制作网页是一个复杂的过程&#xff0c;需要注意到各种细节&#xff0c;只有依靠出色的技术能力和强大的工具&#xff0c;我们才能真正达到我们的目标。幸运的是&#xff0c;有很多优秀的HTML网页设计软件可以让整个流程变得更加轻松和高效。以下就是我们经过深思熟虑和严格筛选…

Stable Video Diffusion重磅发布:基于稳定扩散模型的AI生成视频

最近&#xff0c;stability.ai发布了稳定视频扩散&#xff0c;这是stability.ai第一个基于图像模型稳定扩散的生成视频基础模型。现在可以在研究预览中看到&#xff0c;这个最先进的生成人工智能视频模型代表着stability.ai在为每种类型的人创建模型的过程中迈出了重要的一步。…

吴恩达《机器学习》10-6-10-7:学习曲线、决定下一步做什么

一、学习曲线 1. 学习曲线概述 学习曲线将训练集误差和交叉验证集误差作为训练集实例数量&#xff08;m&#xff09;的函数绘制而成。这意味着从较少的数据开始&#xff0c;逐渐增加训练集的实例数量。该方法的核心思想在于&#xff0c;当训练较少数据时&#xff0c;模型可能…

MySQL进阶-InnoDB引擎

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、语雀 、Github &#x1f389;公众号&#xff1a;猫十二懿 一、InnoDB 逻辑存储引擎 InnoDB的逻辑存储结构如下图所示&#xff1a; 大小关系&#xff1a;表空间&#xff08;Tablespace&#xff0…