当前位置: 首页 > news >正文

【左程云算法全讲6】链表相关

系列综述:
💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
🤭结语:如果有帮到你的地方,就点个赞关注一下呗,谢谢🎈🎄🌷!!!
🌈【C++】秋招&实习面经汇总篇


文章目录

      • 链表问题
        • 基本问题
    • 参考博客


😊点此到文末惊喜↩︎

链表问题

基本问题
  1. 笔试和面试
    • 对于笔试,一般不需要在意空间复杂度
    • 对于面试,时间复杂度作为第一位,但是一定要尽量节省空间
  2. 题目
    • 输入链表头节点,奇数长度返回中点,偶数长度返回上中点
    • 输入链表头节点,奇数长度返回中点,偶数长度返回下中点
    • 输入链表头节点,奇数长度返回中点的前一个,偶数长度返回上中点的前一个
    • 输入链表头节点,奇数长度返回中点的前一个,偶数长度返回下中点的前一个
// 输入链表头节点,奇数长度返回中点,偶数长度返回上中点
Node FindNode(Node head) {// 健壮性检查if (head == nullptr || head->next == nullptr || head->next->next == nullptr)return head;// 初始化Node slow = head->next;Node fast = head->next->next;while (fast->next != nullptr && fast->next->next != nullptr) {slow = slwo->next;fast = fast->next;}return slow;
}// 输入链表头节点,奇数长度返回中点,偶数长度返回下中点
Node FindNode(Node head) {// 健壮性检查if (head == nullptr || head->next == nullptr || head->next->next == nullptr)return head;// 初始化Node slow = head->next;Node fast = head->next;		// 初始化位置不同while (fast->next != nullptr && fast->next->next != nullptr) {slow = slwo->next;fast = fast->next;}return slow;
}
  1. 判断是否为链表是否回文
    • 思路1:先使用栈进行存储,然后再从链表头开始与栈中元素进行比较
    • 思路2:找到链表中间,然后使用栈存储后半部分,再链表与栈中进行一一比较
    • 思路3:原地空间,找到链表中间,将后半部分指针逆序,然后
// 定义三个匿名函数进行处理
auto 找中点
auto 反转链表
auto 比较
  1. 链表调整:小于放左边,等于放中间,大于放右边
    • 笔试使用:放在数组中,然后进行partition
    • 桶思想:进行区域划分:小于、等于、大于的每个区域有两个指针
在这里插入代码片
  1. 克隆带有随机指针的链表
    • 思路1:使用unordered_map<int, Node*>,遍历链表存入哈希表中,再遍历一遍设置随机指针
    • 思路2:在每个节点后面克隆并插入,然后设置新插入节点的random指针,分离新节点链表(这个过程和random无关)
Node* copyRandomList(Node* head) {if (head == nullptr) return nullptr;// 复制结点并插入到结点后面Node *cur  = head;Node *next = nullptr;while (cur != nullptr) {next = cur->next;cur->next = new Node(cur->val);cur->next->next = next;cur = next;}// 复制所有结点的random关系cur = head;Node *cur_copy = nullptr;while (cur != nullptr) {next = cur->next->next; // 先记录cur_copy = cur->next;cur_copy->random = cur->random != nullptr ? cur->random->next : nullptr;cur = next;             // 后迭代}// 分离链表Node *res = head->next;cur = head;while (cur != nullptr) {// 先记录,后使用,注意每次迭代要还原和结尾情况next = cur->next->next;cur_copy = cur->next;cur->next = next;cur_copy->next = next != nullptr ? next->next : nullptr;cur = next;}return res;
}
  1. 如何两个链表相交返回第一个交点, 如果不相交返回nullptr
    • 思路1:使用unordered_set,一边遍历一边查set表,判断是否成环
    • 思路2:遍历两个链表长度,然后相减。再遍历长链表-短链表长度次,最后共同再一起遍历
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if (headA == nullptr || headB == nullptr) return nullptr;ListNode *cur1 = headA;ListNode *cur2 = headB;// 求两个链表长度的差值int n = 0;while (cur1->next != nullptr) {++n;cur1 = cur1->next;} while (cur2->next != nullptr) {--n;cur2 = cur2->next;}// 如果两个链表相交,必然最后一个结点地址相同// 否则两个链表不相交if (cur1 != cur2) return nullptr;cur1 = (n > 0 ? headA : headB);cur2 = (n > 0 ? headB : headA);n = abs(n); // 差值转正// 长链表头先走差值步while (n != 0) {--n;cur1 = cur1->next;}// 两个链表头一起走while (cur1 != cur2) {cur1 = cur1->next;cur2 = cur2->next;}return cur1;
}
  1. 链表成环问题:如果成环返回环的入口结点
    • 遍历成环的单链表,如果
    • 思路1:使用unordered_set,一边遍历一边查set表,判断是否成环
    • 思路2:快指针一次走两步,慢指针一次走一步。然后在环内相遇后,然后快指针重新从头开始,快慢指针继续走,再次遇到环的入口
ListNode *detectCycle(ListNode *head) {// 健壮性检查:注意必须都不为空if (head == nullptr || head->next == nullptr || head->next->next == nullptr) return nullptr;// 先进行一次,然后就可以将判断条件设置为fast != slowwListNode *fast = head->next->next;ListNode *slow = head->next;// 快指针走两步,慢指针走一步while (fast != slow) {if (fast->next == nullptr || fast->next->next == nullptr)return nullptr;slow = slow->next;fast = fast->next->next;}// 然后快指针指向头,两个指针同步每次走一步fast = head;while (fast != slow) {slow = slow->next;fast = fast->next;}return slow;
}
  1. 知道一个单链表中的某个结点地址,删除该结点
    • 思路1:遍历链表到该结点的前一个结点,然后进行删除
    • 思路2(借尸还魂):使用该节点的后一个结点的值拷贝覆盖该结点,然后删除该节点的后一个结点。
      • 拷贝开销:如果结点拷贝开销特别大,如集群则无法进行
      • 结尾结点问题:无法删除链表的最后一个结点,但是结尾可以使用一个空结点哨兵,标识结尾


少年,我观你骨骼清奇,颖悟绝伦,必成人中龙凤。
不如点赞·收藏·关注一波

🚩点此跳转到首行↩︎

参考博客

  1. 对数器
  2. 单调队列
  3. 快速链表quicklist
  4. 《深入理解计算机系统》
  5. 侯捷C++全系列视频
  6. 待定引用
  7. 待定引用
  8. 待定引用

相关文章:

【左程云算法全讲6】链表相关

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…...

从HDFS到对象存储,抛弃Hadoop,数据湖才能重获新生?

Hadoop与数据湖的关系 1、Hadoop时代的落幕2、Databricks和Snowflake做对了什么3、Hadoop与对象存储&#xff08;OSD&#xff09;4、Databricks与Snowflake为什么选择对象存储5、对象存储面临的挑战 1、Hadoop时代的落幕 十几年前&#xff0c;Hadoop是解决大规模数据分析的“白…...

灰度与二值化

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…...

No183.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...

[C国演义] 第十八章

第十八章 最长斐波那契子序列的长度最长等差数列等差序列划分II - 子序列 最长斐波那契子序列的长度 力扣链接 子序列 ⇒ dp[i] — — 以 arr[i] 结尾的所有子序列中, 斐波那契子序列的最长长度子序列 ⇒ 状态转移方程 — — 根据最后一个位置的组成来划分 初始化 — — 根…...

发送失败的RocktMQ消息,你遇到过吗?

背景 需要通过flink同时向测试和线上的RocketMQ中写入数据 现象 在程序中分别创建了两个MqProducer&#xff0c;设置了不同的nameServerAddr&#xff0c;分别调用不同的producer向不同环境发消息&#xff0c;返回发送成功&#xff0c;但是在线上MQ中却查不到数据&#xff0…...

Unity中全局光照GI的总结

文章目录 前言一、在编写Shader时&#xff0c;有一些隐蔽的Bug不会直接报错&#xff0c;我们需要编译一下让它显示出来&#xff0c;方便修改我们选择我们的Shader&#xff0c;点击编译并且展示编译后的Shader后的内容&#xff0c;隐蔽的Bug就会暴露出来了。 二、我们大概回顾一…...

毫米波雷达技术在自动驾驶中的关键作用:安全、精准、无可替代

自动驾驶技术正以前所未有的速度不断演进&#xff0c;而其中的关键之一就是毫米波雷达技术。作为自动驾驶系统中的核心感知器件之一&#xff0c;毫米波雷达在保障车辆安全、实现精准定位和应对复杂环境中发挥着不可替代的作用。本文将深入探讨毫米波雷达技术在自动驾驶中的关键…...

Jetson平台180度鱼眼相机畸变校正调试记录

1.需求说明 由于使用180度GMSL鱼眼相机,畸变很大; 如需算法使用,必须进行畸变校正 2. 硬件说明 相机: 森云 SG2-AR0233-5300-GMSL2-190H 主板: Jetson NX 3. opencv畸变矫正处理 3.1 获取内参系数 现在森云相机可以直接读取内部flash获取内参系数 3.2 畸变处理 …...

axios请求的问题

本来不想记录&#xff0c;但是实在没有办法&#xff0c;因为总是会出现post请求&#xff0c;后台接收不到数据的情况,还是记录一下如何的解决的比较好。 但是我使用export const addPsiPurOrder data > request.post(/psi/psiPurOrder/add, data); 下面是封装的代码。后台接…...

【pandas刷题系列】Leetcode Problem: [595. 大的国家]

Problem: 595. 大的国家 文章目录 思路解题方法复杂度Code 思路 筛选出对应的数据&#xff0c;然后将不需要的列去除 解题方法 筛选出对应的数据&#xff0c;然后将不需要的列去除 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code import pandas a…...

【打卡】牛客网:BM46 最小的K个数

资料&#xff1a; 1. 排序 sort(name.begin(),name.end()); //升序 sort(name.rbegin(),name.rend()); //降序 【C】vector数组排序_vector排序_比奇堡咻飞兜的博客-CSDN博客 2. 把v2的部分值赋给v1 v1.assign(v2.begin(), v2.end()); // 用新元素替换vector 中的元素。…...

Android各类View触摸监听器失效

在XML布局中出现重叠的View&#xff0c;位置靠后定义的View会覆盖住位置靠前的View&#xff1b;即靠后的View会拦截触碰事件导致靠前的View无法收到触碰事件&#xff0c;无法触发监听器。 //例.<?xml version"1.0" encoding"utf-8"?> <android…...

未整理的知识链接

【scala】下划线用法总结 【scala】下划线用法总结_scala 下划线-CSDN博客 Spark Sql Row 的解析 Spark Sql Row 的解析 - 简书 spark dataframe foreach spark dataframe foreach_mob64ca12f0cf8f的技术博客_51CTO博客 spark- Dataframe基本操作-查询 https://blog.csdn.n…...

【2011年数据结构真题】

41题 41题解答&#xff1a; &#xff08;1&#xff09;图 G 的邻接矩阵 A 如下所示&#xff1a; 由题意得&#xff0c;A为上三角矩阵&#xff0c;在上三角矩阵A[6][6]中&#xff0c;第1行至第5行主对角线上方的元素个数分别为5, 4, 3, 2, 1 用 “ 平移” 的思想&#xff0c;…...

【科研绘图】MacOS上的LaTeX公式插入工具——LaTeXiT

在Mac上经常用OmniGraffle绘图&#xff0c;但是有个致命缺点是没办法插入LaTeX公式&#xff0c;很头疼。之前有尝试用Pages文稿插入公式&#xff0c;但是调字体和颜色很麻烦。并且&#xff0c;PPT中的公式插入感觉也不太好看。 偶然机会了解到了LaTeXiT这个工具&#xff0c;可…...

仓库自动化中的RFID技术的应用浅谈

仓库自动化与RFID技术的结合代表着现代供应链管理的一个重要革新。这两者的协同作用能够显著提升仓储效率、降低成本、增强库存管理、提高货物跟踪的准确性&#xff0c;并且使仓库操作更加智能化。 仓库自动化是一种通过应用自动化技术和系统来管理和优化仓库操作的方法。这种…...

容器网络-Underlay和Overlay

一、主机网络 前面讲了容器内部网络&#xff0c;但是容器最终是要部署在主机上&#xff0c;跨主机间的网络访问又是怎么样的&#xff0c;跨主机网络主要有两种方案。 二、 Underlay 使用现有底层网络&#xff0c;为每一个容器配置可路由的网络IP。也就是说容器网络和主机网络…...

基于FPGA的PCIe-Aurora 8/10音频数据协议转换系统设计阅读笔记

文章可知网下载阅读&#xff0c;该论文设计了一种 PC 到光纤模块&#xff08;基于Aurora的光纤传输&#xff09;的数据通路&#xff0c;成功完成了Aurora 以及 DDR 等模块的功能验证。 学习内容&#xff1a; 本次主要学习了Pcie高速串行总线协议、Aurora高速串行总线协议、DDR相…...

stm32控制舵机sg90

一、sg90简介 首先介绍说一下什么是舵机。舵机是一种位置&#xff08;角度&#xff09;伺服的驱动器。适用于一些需要角度不断变化的&#xff0c;可以保持的控制系统。sg90就是舵机的一种。 舵机的工作原理比较简单。舵机内部有一个基准电压&#xff0c;单片机产生的PWM信号通…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...