C++刷题 -- 链表

C++刷题 – 链表

文章目录

  • C++刷题 -- 链表
    • 1.删除链表的倒数第 N 个结点
    • 2.链表相交
    • 3.环形链表


1.删除链表的倒数第 N 个结点

https://leetcode.cn/problems/remove-nth-node-from-end-of-list/

快慢指针的应用

  • fast指针先移动N步,slow依然指向head;
  • 然后fast和slow同时移动,直到fast指向链表最后一个节点的next,也就是空,此时slow就指向了倒数第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) {if(head == nullptr || head->next == nullptr){return nullptr;}ListNode* fast = head;ListNode* slow = head;ListNode* prev = nullptr;//fast指针先移动N步,slow依然指向headfor(int i = 0; i < n; i++){fast = fast->next;}//然后fast和slow同时移动,直到fast指向链表最后一个节点的next,也就是空,此时slow就指向了倒数第N个节点while(fast){fast = fast->next;prev = slow;slow = slow->next;}if(prev) {prev->next = slow->next;delete(slow);}else // 如果prev为空,则删除的是头结点{prev = head;head = head->next;delete(prev);}return head;}
};

2.链表相交

https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/

  • 两个链表相交之后的部分一定是相同的;
  • 可以分别计算两个链表的长度,然后计算长度差
  • 让两个链表从末尾对齐,如下图所示,指针curA和curB同时向后遍历,直到两者的指针地址相同;
    请添加图片描述
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {int cntA = 0, cntB = 0;ListNode* curA = headA;ListNode* curB = headB;//遍历得到AB的长度while(curA){cntA++;curA = curA->next;}while(curB){cntB++;curB = curB->next;}//计算长度差,让长链表先走int skip = abs(cntA - cntB);ListNode* longerList = headA;ListNode* shorterList = headB;if(cntA < cntB){swap(longerList, shorterList);}curA = longerList;curB = shorterList;while(skip--){curA = curA->next;}//两个指针一起走while(curA != curB){curA = curA->next;curB = curB->next;}return curA;}
};

3.环形链表

https://leetcode.cn/problems/linked-list-cycle-ii/description/

判断链表是否有环

  • 快慢指针:分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环
  • fast指针一定先进入环中,如果fast指针和slow指针相遇的话,一定是在环中相遇;
  • 这是因为fast是走两步,slow是走一步,其实相对于slow来说,fast是一个节点一个节点的靠近slow的,所以fast一定可以和slow重合请添加图片描述

找到这个环的入口

  • 假设从头结点到环形入口节点 的节点数为x。 环形入口节点到 fast指针与slow指针相遇节点 节点数为y。 从相遇节点 再到环形入口节点节点数为 z。请添加图片描述
    -那么相遇时: slow指针走过的节点数为: x + y, fast指针走过的节点数:x + y + n (y + z),n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。
  • 因为fast指针是一步走两个节点,slow指针一步走一个节点, 所以 fast指针走过的节点数 = slow指针走过的节点数 * 2
    (x + y) * 2 = x + y + n (y + z)
  • 两边消掉一个(x+y): x + y = n (y + z)
  • 因为要找环形的入口,那么要求的是x,因为x表示 头结点到 环形入口节点的的距离。
  • 将x单独放在左面:x = n (y + z) - y
  • 再从n(y+z)中提出一个 (y+z)来,整理公式之后为如下公式:x = (n - 1) (y + z) + z 注意这里n一定是大于等于1的,因为 fast指针至少要多走一圈才能相遇slow指针
  • 先拿n为1的情况来举例,意味着fast指针在环形里转了一圈之后,就遇到了 slow指针了。
    当 n为1的时候,公式就化解为 x = z
  • 这就意味着,从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。
  • 也就是在相遇节点处,定义一个指针index1,在头结点处定一个指针index2。
    让index1和index2同时移动,每次移动一个节点, 那么他们相遇的地方就是 环形入口的节点。请添加图片描述
  • 那么 n如果大于1是什么情况呢,就是fast指针在环形转n圈之后才遇到 slow指针。
    其实这种情况和n为1的时候 效果是一样的,一样可以通过这个方法找到 环形的入口节点,只不过,index1 指针在环里 多转了(n-1)圈,然后再遇到index2,相遇点依然是环形的入口节点。
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* fast = head;ListNode* slow = head;while(fast && fast->next) //如果没有环,fast或者fast->next就会为空{fast = fast->next->next; //快指针一次走两步slow = slow->next; //慢指针一次走一步//若有环,则fast和slow会在环内相遇if(fast == slow){//两个指针从相遇节点和头节点同时向后走,最终的相遇点就是环的入口ListNode* index1 = head;ListNode* index2 = fast;while(index1 != index2){index1 = index1->next;index2 = index2->next;}return index2;}}return nullptr;}
};

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

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

相关文章

短视频文案生成器有哪些?【2024新版短视频文案生成器】

在当今数字化社交时代&#xff0c;短视频已经成为人们生活中不可或缺的一部分。然而&#xff0c;想要制作引人注目、独具创意的短视频&#xff0c;光有精彩的画面和音效可能不够&#xff0c;一个吸引眼球的短视频文案也是至关重要的。本文将专心分享短视频文案生成器的种类&…

OpenTiny Vue 3.12.0 发布:文档大优化!增加水印和二维码两个新组件

你好&#xff0c;我是 Kagol。 非常高兴跟大家宣布&#xff0c;2023年11月30日&#xff0c;OpenTiny Vue 发布了 v3.12.0 &#x1f389;。 OpenTiny 每次大版本发布&#xff0c;都会给大家带来一些实用的新特性&#xff0c;10.24 我们发布了 v3.11.0 版本&#xff0c;增加了富…

企业级自动化测试理论(目标、框架要素、深入理解测试金字塔)

1. 自动化测试的目标 自动化测试的目标是加快研发过程&#xff0c;而不是试图省钱。 迅速检测出新版本中不稳定的变更。 迅速暴露程序回归的错误。 迅速报告问题&#xff0c; 因为这会使程序错误修改更容易。 为了达到目标&#xff0c;所需要的测试能力要求 测试技术&…

YITH WooCommerce Questions and Answers电商网站问答功能高级版

点击阅读YITH WooCommerce Questions and Answers电商网站问答功能高级版原文 YITH WooCommerce Questions and Answers电商网站问答高级版的作用在您的产品页面中构建强大的问答部分&#xff0c;以便您的客户可以找到问题的答案并毫无疑问地购买。 您如何从中受益&#xff1…

LabVIEW远程监控

LabVIEW远程监控 远程监控的应用场景 从办公室远程监控工厂车间的测试设备。 在世界另一端的偏远地区监控客户现场的发电设备。 从公司远程监控外场的产品。 技术更新与方法 自2018年以来&#xff0c;NI对基于Web的应用程序支持大幅增长。一些最初的方法&#xff08;如Lab…

3.镜像加速器

目录 1 阿里云 2 网易云 从网络上拉取镜像的时候使用默认的源可能会慢&#xff0c;用国内的源会快一些 1 阿里云 访问 阿里云-计算&#xff0c;为了无法计算的价值 然后登录&#xff0c;登录后搜索 容器镜像服务 点击容器镜像服务 点击管理控制台 点击 镜像工具->镜像…

【web安全】文件包含漏洞详细整理

前言 菜某的笔记总结&#xff0c;如有错误请指正。 本文用的是PHP语言作为案例 文件包含漏洞的概念 开发者使用include&#xff08;&#xff09;等函数&#xff0c;可以把别的文件中的代码引入当前文件中执行&#xff0c;而又没有对用户输入的内容进行充分的过滤&#xff0…

5G入门到精通 - 5G的十大关键技术

文章目录 一、网络切片二、自组织网络三、D2D技术四、低时延技术五、MIMO技术六、毫米波七、内容分发网络八、M2M技术九、频谱共享十、信息中心网络 一、网络切片 5G中的网络切片是一项关键技术&#xff0c;它允许将整个5G网络分割成多个独立的虚拟网络&#xff0c;每个虚拟网络…

CodeBlocks添加头文件,解决fatal error: ui.h No such file or directory

问题描述 在使用codeblocks工具进行LVGL仿真过程中报错&#xff0c;找不到头文件 原因分析&#xff1a; 没有将头文件加入编辑器搜索的目录中&#xff0c;编译时找不到头文件。 解决方案&#xff1a; 将要包含的头文件的目录加进去就可以了

BCI-Two-streams hypothesis(双流假说)

双流假说 双流假设(Two-stream hypothesis)是关于视觉和听觉神经处理的模型。该假设最初由大卫米尔纳&#xff08;David Milner&#xff09;和梅尔文古德尔&#xff08;Melvyn A. Goodale&#xff09;于1992年的一篇论文中进行了初步描述&#xff0c;认为人类拥有两个独立的视觉…

【爬取音乐,并将音乐信息储存到数据库中】

爬取音乐,并将音乐信息储存到数据库中 确定音乐网站的url并分析网站分析二级页面创建数据库使用Xpath解析&#xff0c;进行多层爬取保存信息完整代码结果 确定音乐网站的url并分析网站 分析二级页面 创建数据库 # 创建一个链接对象 conn pymysql.connect(hostmaster, userroo…

虚拟网络技术:bond技术

网卡bond也称为网卡捆绑&#xff0c;就是将两个或者更多的物理网卡绑定成一个虚拟网卡。 bond的作用&#xff1a; 1.提高网卡的吞吐量 2.增加网络的高可用&#xff0c;实现负载均衡。 一、bond简介 bond技术即bonding&#xff0c;能将多块物理网卡绑定到一块虚拟网卡上&…

六、C语言数组

1. 数组的概念 数组是⼀组相同类型元素的集合&#xff1b;从这个概念中我们就可以发现2个有价值的信息&#xff1a; 数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0。数组中存放的多个数据&#xff0c;类型是相同的。 数组分为⼀维数组和多维数组&#xf…

Prometheus 发现机制和告警

1.服务发现 Prometheus Server的数据抓取工作于Pull模型&#xff0c;因而&#xff0c;它必需要事先知道各Target的位置&#xff0c;然后才能从相应的Exporter或Instrumentation中抓取数据。在不同的场景下&#xff0c;需要结合不同的机制来实现对应的数据抓取目的。 对于小型的…

企业级 接口自动化测试框架:Pytest+Allure+Excel

1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具&#xff0c;它不仅以 Web 的方式展示了简介的测试结果&#xff0c;而且允许参与开发过程的每个人可以从日常执行的测试中&#xff0c;最大限度地提取有用信息。 Allure 是由 Java 语言开发…

【学习记录】从0开始的Linux学习之旅——字符型设备驱动及应用

一、概述 Linux操作系统通常是基于Linux内核&#xff0c;并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程&#xff0c;具有强大的网络功能和良好的兼容性。基于前面应用与驱动的开发学习&#xff0c;本文主要讲述如何在linux系统上把应用与驱动…

参考信号速度变化存在跳跃时容易发生不稳定的阻抗调节

问题描述 当参考信号速度存在跳跃变化时&#xff0c;阻抗调节系统容易发生不稳定。这是因为阻抗调节系统需要根据参考信号的速度来调整其输出阻抗&#xff0c;以匹配负载阻抗&#xff0c;从而保持系统的稳定性。 当参考信号速度突然变化时&#xff0c;阻抗调节系统可能无法及…

『TypeScript』深入理解变量声明、函数定义、类与接口及泛型

&#x1f4e3;读完这篇文章里你能收获到 了解TypeScript变量声明与类型注解掌握TypeScript函数与方法的使用掌握TypeScript类与接口的使用掌握TypeScript泛型的应用 文章目录 一、变量声明与类型注解1. 变量声明2. 类型注解3. 类型推断 二、函数与方法定义1. 函数定义2. 方法定…

Jmeter 性能测试基础!

压力测试   压力测试分两种场景&#xff1a;一种是单场景&#xff0c;压一个接口的&#xff1b;第二种是混合场景&#xff0c;多个有关联的接口。压测时间&#xff0c;一般场景都运行10-15分钟。如果是疲劳测试&#xff0c;可以压一天或一周&#xff0c;根据实际情况来定。 压…

springboot 在自定义注解中注入bean,解决注入bean为null的问题

问题&#xff1a; 在我们开发过程中总会遇到比如在某些场合中需要使用service或者mapper等读取数据库&#xff0c;或者某些自动注入bean失效的情况 解决方法&#xff1a; 1.在构造方法中通过工具类获取需要的bean 工具类代码&#xff1a; import org.springframework.beans…