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;}
};

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

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

相关文章

YOLOv8改进 在更换的PoolFormer主干网络中增加注意力机制

一、PoolFormer的网络结构 PoolFormer采用自注意力机制和池化操作相结合的方式&#xff0c;同时考虑了局部和全局的特征关系。 具体的代码如&#xff08;YOLOv8改进 更换多层池化操作主干网络PoolFormer_yolov8池化-CSDN博客&#xff09;所示。 二、Global Attention Mechan…

python一张大图找小图的个数

python一张大图找小图的个数 一、背景 有时候我们在浏览网站时&#xff0c;发现都是前端搞出来的一张张图&#xff0c;我们只能用盯住屏幕的小眼睛看着&#xff0c;很累的统计&#xff0c;这个是我在项目中发现没办法统计&#xff0c;网上的教程很多&#xff0c;都不成功&…

Python 面向对象编程——类的使用

一、学习目标 1&#xff0e;掌握类的定义和实例化对象。 2&#xff0e;熟练掌握类的构造函数__init__使用。 3&#xff0e;掌握类的继承机制和使用。 二、相关练习 1、定义一个玩具类Toy()&#xff0c;创建名字为“小汽车”、“手枪”和“积木”的玩具实例&#xff0c;计…

深圳牵头打造鸿蒙原生应用软件生态 | 百能云芯

深圳市工业和信息化局、深圳市政务服务和数据管理局于3月3日联合印发了《深圳市支持开源鸿蒙原生应用发展2024年行动计划》。这一计划旨在通过政策引导、市场推动、社会协同的方式&#xff0c;将深圳打造成一个鸿蒙原生应用软件生态的中心&#xff0c;推动鸿蒙系统在当地的发展…

PyQT6的从零开始在Pycharm中配置与使用

PyQT6的从零开始在Pycharm中配置与使用 1.安装PyQt6 PyQt6-tools2.在Pycharm中配置扩展工具2.1配置QTdesigner2.2配置Pyuic 3.启动3.1、启动designer3.2、启动Pyuic 1.安装PyQt6 PyQt6-tools pip install PyQt6 PyQt6-tools安装成功后&#xff0c;查看安装版本&#xff0c;版本…

基于springboot+vue的医疗报销系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

面试笔记系列四之SpringBoot+SpringCloud+计算机网络基础知识点整理及常见面试题

目录 Spring Boot 什么是 Spring Boot&#xff1f; Spring Boot 有哪些优点&#xff1f; SpringBootApplication注解 Spring Boot 的启动流程 Spring Boot属性加载顺序 springboot自动配置原理是什么&#xff1f;&#xff08;*&#xff09; 如何理解springboot中的start…

低代码平台开发实践:基于React的高效构建与创新【文末送书-29】

文章目录 背景低代码平台简介基于React的优势低代码平台的实际应用 低代码平台开发实践&#xff1a;基于React【文末送书-29】 背景 随着技术的不断进步和业务需求的日益复杂&#xff0c;低代码平台成为现代软件开发领域中备受关注的工具之一。在这个快节奏的时代&#xff0c;…

解决手机连接校园网同一设备老是需要重复认证的问题(+解决原理)

相信大家平时在使用校园网的时候总会遇到同一设备隔三岔五就要重复认证绑定的问题&#xff0c;这里直接附上解决方案。 打开手机的wifi-->连接校园网然后进入设置-->在隐私选项选择“使用设备MAC” 如下图&#xff0c;问题解决了&#xff01;如果想知道原理的可以继续往…

如何处理微服务之间的通信和数据一致性?

✨✨祝屏幕前的兄弟姐妹们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、微服务通信 1、同步通信&#xff1a;HTTP 1.1.同步通信示例代码&#xf…

1、Ajax、get、post、ajax,随机颜色

一、Ajax初始 1、什么是Ajax&#xff1f; 异步的JavaScript和xml 2、xml是什么&#xff1f; 一种标记语言&#xff0c;传输和存储数据----------现在用JSON传输数据 3、Ajax的作用 局部加载 可以使网页异步更新 4、Ajax的原理或者步骤(6步) 创建Ajax对象 if (window.X…

2024年租用阿里云服务器多少钱?阿里云服务器租用价格表(最新版)

2024年租用阿里云服务器一年多少钱&#xff1f;不同时期阿里云服务器的租用价格不同&#xff0c;随着2024年阿里云上云采购季活动的开启和阿里云最新一轮的云产品降价调整&#xff0c;阿里云服务器租用价格也做了一些调整&#xff0c;配置最低的1核1G云服务器收费标准为22.8/月…

NAT模式 LVS负载均衡部署

一 架构图 二 文字表述过程 1 当客户端 发起请求报文是: 源ip:客户端的ip地址(cip) 目的地址:vip(代理服务器的外网地址) 2.当数据包到达我们的 代理服务器 源ip不变&#xff0c;需要修改目的ip及端口号 源ip:客户端的ip地址(c…

智慧城市中的数字孪生:构建城市管理的未来框架

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、实时监测与预警 2、模拟与优化 3、智能化决策 4、协同与共享 四、数字孪生技术构建城市管理的未来框架的价值 1、提高管理效率 2、优化资源配置 3、提升公共服务水平 4、增强应对突发事…

【Android开发】02-小费计算APP(Tip Time)

github地址&#xff08;项目中的A02_TipTime文件夹&#xff09;&#xff1a; https://github.com/tao355667/Android_Development 一、功能介绍 输入消费金额和服务满意度后&#xff0c;可计算出相应的小费(可选是否四舍五入)支持中英文系统可根据系统主题的明暗切换界面 二、…

SpringBoot源码解读与原理分析(四)SPI机制

文章目录 2.4 SPI机制&#xff08;Service Provider Interface&#xff09;2.4.1 JDK原生SPI1.定义接口实现类2.声明SPI文件3.测试 2.4.2 SpringFramework 3.2 的SPI1.声明SPI文件2.测试3.Spring SPI机制的实现原理 2.4 SPI机制&#xff08;Service Provider Interface&#xf…

【c++设计模式14】结构型6:享元模式(Flyweight Pattern)

【c设计模式14】结构型6&#xff1a;享元模式&#xff08;Flyweight Pattern&#xff09; 一、定义二、适用场景三、过程四、享元模式类图五、C示例代码六、使用注意事项 类型序号设计模式描述结构型1适配器模式&#xff08;Adapter Pattern&#xff09;它用于在不修改已有类的…

配置ssh连接Esxi、ESXi 收缩虚拟硬盘文件(.vmdk) 大小(回收ESXi thin磁盘空间)

文章目录 一、配置ssh连接Esxi1. Esxi开启ssh服务2. 如何设置ESXI主机启动时自动开启shell(ssh)服务 二、ESXi6.0中将虚拟机从厚置备转换为精简置备三、ESXi 收缩虚拟硬盘文件(.vmdk) 大小1. 三种虚拟磁盘类型2. 如何给ESXi 上的VM缩小硬盘&#xff08;VMDK&#xff09;回收ESX…

【C++精简版回顾】13.(重载1)运算符重载+,前置后置++

1.友元函数方式为类重载运算符 &#xff08;友元函数声明可以放在类任何地方&#xff09; 1.类 class MM { public:MM() {}MM(int grade,string name):grade(grade),name(name){}friend MM operator(MM object1, MM object2);void print() {cout << this->grade <…

单调队列的使用

单调队列其实就是一个队列&#xff0c;只是使用了一点巧妙的方法使得队列中的元素全都是单调递增&#xff08;或单调递减&#xff09;的 单挑队列主要解决以下问题&#xff1a; 滑动窗口在滑动时&#xff0c;r代表右侧数字进入串口&#xff0c;l代表左侧数字出窗口 这个过程…