当前位置: 首页 > 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信号通…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...