c++数据结构算法复习基础-- 3 --线性表-单向链表-笔试面试常见问题
1、单链表逆序
思路图

代码实现
//著: 链表结构里记得加 friend void ReverseLink(Clink& link);
void ReverseLink(Clink& link)
{Node* p = link.head_->next_;while( p == nullptr){return;}Node* q = p->next_;link.head_->next_ = nullptr;while(p != nullptr){Node* q = p->next_;//p指针指向的节点进行头插p->next_ = link.head_->next_;link.head_->next_ = p;p = q;}/*Node* p = link.head_->next_;if( p == nullptr){return;}Node* q = p->next_;link.head_->next_ = nullptr;while( q != nullptr){link.head_->data_ = p->data_;p->next_ = link.head_;link.head_ = p;p = q;q = p->next_;}link.head_->data_ = p->data_;p->next_ = link.head_;link.head_ = p;p = nullptr;*/
}
测试
int main()
{Clink link;Clink link2;srand(time(0));for(int i = 0; i<10; i++){int val = rand() % 100;link.InsertTail(val);}link.show();cout << endl;ReverseLink(link);ReverseLink(link2);link.show();cout << endl;link2.show();cout << endl;
}
运行结果

2、单链表倒数第k个节点
思路图
双指针同步位移,两个指针相聚k个节点

代码实现
//求倒数第k个节点的值
bool MyGetLastKNode(Clink& link,int k,int& val)
{if(k<1){return 0;}Node* p = link.head_;if( p == nullptr){return false;}Node* pre = link.head_;for(int i = 0; i < k ; i++){pre = pre->next_;if( pre == nullptr ){return false;}}//p在头节点,pre在正数第k个节点while( pre != nullptr ){p = p->next_;pre = pre->next_;}val = p->data_;return true;
}
代码测试
int main()
{Clink link;Clink link2;srand(time(0));for(int i = 0; i<10; i++){int val = rand() % 100;link.InsertTail(val);}link.show();cout << endl;int val=0;if(MyGetLastKNode(link,3,val)){cout<< "k == 3 ";cout<< "find " << val<< endl;}else{cout<< "k == 3 ";cout<< "false" << endl;}if(MyGetLastKNode(link,0,val)){cout<< "k == 0 ";cout<< "find " << val<< endl;}else{cout<< "k == 0 ";cout<< "false" << endl;}if(MyGetLastKNode(link,12,val)){cout<< "k == 12 ";cout<< "find " << val<< endl;}else{cout<< "k == 12 ";cout<< "false" << endl;}if(MyGetLastKNode(link2,3,val)){cout<< "k2 == 3 ";cout<< "find " << val<< endl;}else{cout<< "k2 == 3 ";cout<< "false" << endl;}}
运行结果

3、并两个有序单链表
思路图

代码实现
//合并两个有序单链表
bool MergeLink(Clink& link1,Clink& link2)
{Node* p = link1.head_->next_;Node* q = link2.head_->next_;Node* last = link1.head_;link2.head_->next_ = nullptr;while(p != nullptr && q != nullptr){if(p->data_ < q->data_){last->next_ = p;p = p->next_;last = last->next_;}else{last->next_ = q;q = q->next_;last = last->next_;}}if(p != nullptr){last->next_ = p;}else{last->next_ = q;}/*Node* pre = link1.head_;Node* p = link1.head_->next_;Node* q = link2.head_->next_;while(q != nullptr){if(p == nullptr && q != nullptr){pre->next_ = q;link2.head_->next_ = nullptr;return true;}else if(p->data_ <= q->data_)//这里假设从小到大{p = p->next_;pre = pre->next_;}else {link2.head_->next_ = q->next_;pre->next_=q;q->next_ = p;pre=q;q = link2.head_->next_;}}*/return true;
}
运行结果

4、判断单链表是否存在环以及入口节点
思路图

代码实现
//判断单链表是否存在环以及入口节点
//这里参数为Node,方便测试
//记得 friend
bool IsLinkHasCirle(Node* head,int& val)
{Node* fast = head;Node* slow = head;while(fast != nullptr && fast->next_ != nullptr){slow = slow->next_;fast = fast->next_->next_;if(slow == fast){//快慢指针再次相遇,链表存在环fast = head;while(fast != slow){slow = slow->next_;fast = fast->next_;}val = slow->data_;return true;}}return false;
}
测试
int main()
{Node head;Node n1(25),n2(61),n3(312),n4(118);head.next_ = &n1;n1.next_ = &n2;n2.next_ = &n3;n3.next_ = &n4;n4.next_ = &n2;int val;if(IsLinkHasCirle(&head,val)){cout<< "链表存在环,环的入口节点是: "<< val << endl;}}
运行结果

5、判断两个链表是否相交

思路图

代码实现
//判断两个链表是否相交,如果相交,返回相交节点的值
bool IsLinkHasMerge(Node* head1,Node* head2,int &val)
{int cnt1 = 0,cnt2 = 0;Node* p = head1->next_;Node* q = head2->next_;//计算两个链表的长度while(p != nullptr){p = p->next_;cnt1++;}while(q != nullptr){q = q->next_;cnt2++;}p = head1->next_;q = head2->next_;if(cnt1 > cnt2){//第一个链表长cnt1 = cnt1-cnt2;while(cnt1 >0){p = p->next_;cnt1--;}}else{//第二个链表长cnt2 = cnt2 -cnt1;while(cnt2 > 0){q = q->next_;cnt2--;}}while(p != nullptr && q != nullptr){if(p == q){val = p->data_;return true;}p = p->next_;q = q->next_;}return false;
}
测试代码
int main()
{Node head1;Node head2;Node n1(25),n2(61),n3(312),n4(118),n5(18);Node nn1(1),nn2(2);head1.next_ = &n1;n1.next_ = &n2;n2.next_ = &n3;n3.next_ = &n4;n4.next_ = &n5;head2.next_ = &nn1;nn1.next_ = &nn2;nn2.next_ = &n3;int val;if(IsLinkHasMerge(&head1,&head2,val)){cout<< "两个链表相交,相交的节点是: "<< val << endl;}}
运行结果

6、删除链表倒数第N个节点
思维图

代码实现
//这里使用利扣刷题
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {//在函数内部给链表增加一个头节点,以解决不带头节点的单链表//head_->next headListNode* head_ = new ListNode(0,head);ListNode* first = head;ListNode* second = head_;for(int i = 0; i < n; i++){first = first->next;}while(first){first = first->next;second = second->next;}second->next = second->next->next;ListNode* ans = head_->next;delete head_;return ans;;}};
7、旋转链表
思路图

代码实现
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* rotateRight(ListNode* head, int k) {ListNode*p = head;ListNode*q = head;if(head == nullptr || k == 0){return head;}int number = 0;//判断链表的长度for(ListNode *k = head; k != nullptr; k = k->next){number++;}k = k%number;for(int i = 0; i < k; i++){p = p->next;}while(p->next != nullptr){q = q->next;p = p->next;}p->next = head;head = q->next;q->next = nullptr;return head;}
};
相关文章:
c++数据结构算法复习基础-- 3 --线性表-单向链表-笔试面试常见问题
1、单链表逆序 思路图 代码实现 //著: 链表结构里记得加 friend void ReverseLink(Clink& link); void ReverseLink(Clink& link) {Node* p link.head_->next_;while( p nullptr){return;}Node* q p->next_;link.head_->next_ nullptr;while(p ! nullpt…...
【踩坑专栏】追根溯源,从Linux磁盘爆满排查故障:mycat2与navicat不兼容导致日志暴增
昨天遇到了一个比较奇怪的问题,就是在挂起虚拟机的时候,虚拟机提示我XX脚本正在运行,很奇怪,我没有运行脚本,为什么会提示我这个呢。今天恢复虚拟机,也提示了一下脚本的问题,而且发现Linux明显异…...
DolphinScheduler——奇富科技的调度实践
目录 一、技术架构 二、业务挑战 2.1 调度任务量大 2.2 运维复杂 2.3 SLA要求高 三、调度优化实践 3.1 重复调度 3.2 漏调度 3.3 Worker服务卡死 3.4 任务重复运行 四、服务监控 4.1 方法耗时监控 4.2 任务调度链路监控 五、用户收益 原文大佬的这篇调度系统案例…...
2024年最全洗地机选购攻略盘点丨希亦、小米、云鲸、海尔洗地机哪款值得入手?
在现代家居清洁中,洗地机是不可或缺的得力助手,它融合了吸尘、拖地等多种功能。面对市场上琳琅满目的洗地机品牌和型号,选择一个可靠的品牌至关重要。优质的品牌能够提供高品质的产品,使您的清洁工作更加轻松高效。本文将向您推荐…...
HTML笔记3
21,label标签 <label for"...">...</label> <label>...</label> <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content&qu…...
利用Python副业赚钱,看完这篇你就懂了!
Python都可以做哪些副业? 1、兼职处理数据Excel整理数据功能虽然很强大,但在Python面前,曾经统治职场的它也的败下阵来。因为Python在搜集数据整理分析数据的过程中更加便捷,通过几行代码还可以实现自动化操作。 如果你学会Pyth…...
FP16(半精度浮点数)、FP32(单精度浮点数)和INT8
在深度学习和计算机视觉领域中,FP16(半精度浮点数)、FP32(单精度浮点数)和INT8(8 位整数)是常见的数据类型或精度表示方式。它们在不同的场景下有各自的优势和用途。 FP16(半精度浮…...
MySQL数据管理二
1.数据库的完整性 数据库中的数据是从外界输入的,而数据的输入由于种种原因,会发生输入无效或错误信息。保证输入的数据符合规定,成为了数据库系统,尤其是多用户的关系数据库系统首要关注的问题。 它是应防止数据库中存在不符合语…...
sqoop-import 详解
文章目录 前言一、介绍1. sqoop简介2. sqoop import的作用3. 语法3.1 sqoop import 语法3.2 导入配置属性 二、导入参数1. 常见参数2. 验证参数3. 导入控制参数4. 用于覆盖映射的参数5. 增量导入参数6. 输出行格式参数7. 输入解析参数8. Hive 参数9. HBase 参数10. Accumulo 参…...
第二周opencv
一、边缘检测算子 边缘检测算子是用于检测图像中物体边界的工具。边缘通常表示图像中灰度值或颜色发生显著变化的地方。边缘检测有助于识别图像中的物体形状、轮廓和结构。这些算子通过分析图像的灰度或颜色梯度来确定图像中的边缘。 梯度算子 要得到一幅图像的梯度,…...
python_读取txt文件绘制多条曲线II
从给定的列表中来匹配txt文件对应列的数据; import matplotlib.pyplot as plt import re from datetime import datetime from pylab import mplmpl.rcParams["font.sans-serif"] ["SimHei"] # 设置显示中文字体 mpl.rcParams["axes.un…...
java排序简单总结和推荐使用套路(数据排序,结构体排序)
了解int和Integer的区别 int是Java的基本数据类型,用于表示整数值。Integer是int的包装类,它是一个对象,可以包含一个int值并提供一些额外的功能。 Java集合框架中的集合类(如List、Set、Map)只能存储对象,…...
掘根宝典之C语言联合和枚举
联合 C语言中的联合(Union)是一种特殊的数据类型,它允许在同一块内存空间中存储不同类型的数据。 联合与结构体类似,但不同的是,在给联合变量赋值时,它只能存储最后一次赋值的值。 创建联合 在C语言中&…...
【debug】element-ui时间控件回显后不可编辑且显示为空
问题:使用element-ui的时间控件回显数据,编辑数据没有反应:点时间和“确认”按钮都没反应。 输入框中会显示数据,但提交时的校验显示为空。 <el-form-item label"开始时间" prop"limitStartTime"><…...
【Linux从青铜到王者】进程信号
——————————————————————————————————————————— 信号入门 在了解信号之前有许多要理解的相关概念 我们可以先通过一个生活例子来初步认识一下信号 1.生活角度的信号 你在网上买了很多件商品,再等待不同商品快递的到来…...
MyBatis-Plus 快速入门
介绍 jMyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 官网:MyBatis-Plus (baomidou.com) 1.…...
iOS调起高德/百度/腾讯/谷歌/苹果地图并使用GCJ02坐标进行导航
使用演示: 2.地图API相关网站 : 高德:...
HarmonyOS Full SDK的安装
OpenHarmony的应用开发工具HUAWEI DevEco Studio现在随着OpenHarmony版本发布而发布,只能在版本发布说明中下载,例如最新版本的OpenHarmony 4.0 Release。对应的需要下载DevEco Studio 4.0 Release,如下图。 图片 下载Full SDK主要有两种方式,一种是通过DevEco Studio下载…...
小程序嵌套H5-真机突然无法使用
今天测试反馈了一个问题,测试环境的小程序突然就登录不了了。我自己拿手机扫码登录是正常的,用其他同事的手机扫描登录也是正常。 下面是排查的路线: 1、其他环境使用测试手机扫码登录是否正常?(正常) 2、H5地址改为本地IP&#…...
自然语言处理 | 语言模型(LM) 浅析
自然语言处理(NLP)中的语言模型(Language Model, LM)是一种统计模型,它的目标是计算一个给定文本序列的概率分布,即对于任意给定的一段文本序列(单词序列),语言模型能够估…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
