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)是一种统计模型,它的目标是计算一个给定文本序列的概率分布,即对于任意给定的一段文本序列(单词序列),语言模型能够估…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
