【卡码网C++基础课 14.链表的基础操作2】

2024-09-01 15:36

本文主要是介绍【卡码网C++基础课 14.链表的基础操作2】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 题目描述与分析
  • 代码编写


题目描述与分析

题目描述:
请编写一个程序,实现以下操作:

构建一个单向链表,链表中包含一组整数数据,输出链表中的第 m 个元素(m 从 1 开始计数)。
要求:
1.使用自定义的链表数据结构
2.提供一个 linkedList 类来管理链表,包含构建链表、输出链表元素以及输出第 m 个元素的方法
3.在 main 函数中,创建一个包含一组整数数据的链表,然后输入 m,调用链表的方法输出第 m 个元素

输入描述:
第一行包含两个整数 n 和 k,n 表示需要构建的链表的长度,k 代表输入的 m 的个数。
接下来一行包含 n 个整数,表示链表中的元素。
接下来一行包含 k 个整数,表示输出链表中的第 m 个元素。

输出描述:
测试数据输出占 k 行。
每行输出链表中的第 m 个元素。如果 m 位置不合法,则输出“Output position out of bounds.”。

输入示例:

5 5
1 2 3 4 5
4 3 2 9 0

输出示例:

4
3
2
Output position out of bounds.
Output position out of bounds.

代码编写

依旧先把代码的基础结构给搭建好,先把链表结构体写出来:

#include <iostream>
using namespace std;
// 定义链表节点结构体
struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(nullptr) {}
};
int main() {}
int n, k, m;
cin >> n >> k; // 输入n和k, n 表示需要构建的链表的长度,k 代表输入的 m 的个数。
ListNode* dummyHead = new ListNode(0); // 创建了一个虚拟头结点

和上一节内容相似,依旧需要使用for 循环,根据读取的 n 值,迭代读取 n 个整数,构建链表。

for (int i = 0; i < n; i++) { // 或者使用while(n--)int val; // 变量val接收输入的val值cin >> val;ListNode *newNode = new ListNode(val); // 构造一个新的节点cur -> next = newNode; // 将新节点接入链表cur = cur -> next;      // cur 指向下一个节点
}

上面的操作完成之后,链表就成功构建了,我们需要根据题目要求读取k个m,并输出这k个值

while(k--) {cin >> m;  // 输入k个m, m表示需要输出的节点的顺序
}

每次找到第m个节点都需要从头节点开始遍历,所以将 cur 重新指向虚拟头结点,以便重新遍历链表。

cur = dummyHead; // cur重新指向虚拟头节点,以便重新遍历链表

在这里插入图片描述
使用 while 循环,寻找链表中的第 m 个元素, 只要cur没有指向null,就一直循环下去

while(m--) {if(cur != NULL) {cur = cur->next;  // 找到第m个节点} else {break;}
}

当while循环结束后,如果cur指向null,说明输入的m已经超出了链表的长度,如果cur还是指向dummyNode说明没有进入到while循环,也就是m=0,这两种情况都是m位置不合法的情况。

// cur == NULL 表示 m 超出了链表长度
// cur == dummyHead 表示 m = 0
if (cur == NULL || cur == dummyHead) {cout << "Output position out of bounds." << endl;
} else {// cur表示第m个节点,正常输出cur节点的val值cout << cur->val << endl;
}

完整代码如下:

#include <iostream>
using namespace std;
struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(nullptr) {}
};
int main() {int n, val, m, k;ListNode* dummyHead = new ListNode(0); // 创建了一个虚拟头结点cin >> n >> k;ListNode* cur = dummyHead; // 定义一个指向当前节点的指针 cur,初始指向虚拟头结点for (int i = 0; i < n; i++) { // 或者使用while(n--)cin >> val;ListNode* newNode = new ListNode(val); // 构造一个新的节点cur -> next = newNode; // 将新节点接入链表cur = cur -> next;      // cur 指向下一个节点}while (k--) {cin >> m;cur = dummyHead;while (m--) { // 寻找链表里第m个元素if(cur != NULL) cur = cur->next;else break;}// cur == NULL 表示 m 超出了链表长度// cur == dummyHead 表示 m = 0if (cur == NULL || cur == dummyHead) cout << "Output position out of bounds." << endl;else cout << cur->val << endl;}
}

这篇关于【卡码网C++基础课 14.链表的基础操作2】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127338

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝