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)是一种统计模型,它的目标是计算一个给定文本序列的概率分布,即对于任意给定的一段文本序列(单词序列),语言模型能够估…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...