题目:C++快速找到未知长度单链表的中间节点。普通方法和高级方法2种解题思路解析。

在数据结构的面试中,经常会出现这样的问题:如何快速找到未知长度单链表的中间节点?通常,面试官会期待你提供两种解法:一种是最基本的普通方法,另一种是更高效的 advanced 方法。本文将详细介绍这两种方法。

普通方法

思路
普通方法首先需要遍历整个链表以确定其长度 L。然后,再次从头节点出发,循环 L/2 次找到中间节点。

算法步骤

  1. 初始化一个变量 length 用于记录链表长度,将头节点 head 赋值给 length。
  2. 创建一个临时节点 temp,用于遍历链表,将头节点赋值给 temp。
  3. 遍历链表,每遍历一次,length 减一,直到 length 等于 0。
  4. 将 temp 重新赋值为头节点 head,循环 length/2 次,每次移动 temp 一步。
  5. 当循环结束时,temp 所指向的节点即为链表的中间节点。

时间复杂度
普通方法的时间复杂度为 O(L + L/2) = O(3L/2),其中 L 为链表的长度。

代码实现

struct ListNode {int val;struct ListNode* next;
};struct ListNode* findMiddleNode(struct ListNode* head) {int length = 0;struct ListNode* temp = head;while (temp != NULL) {length++;temp = temp->next;}temp = head;for (int i = 0; i < length / 2; i++) {temp = temp->next;}return temp;
}

高级方法

思路
高级方法使用快慢指针。快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针所指的节点就是链表的中间节点。

算法步骤

  1. 初始化两个指针,快指针 fast 和慢指针 slow,都指向头节点 head。
  2. 让快指针先移动,每次移动两步;慢指针移动一步。
  3. 当快指针到达链表的末尾时,慢指针所指向的节点就是链表的中间节点。

时间复杂度
高级方法的时间复杂度为 O(L),其中 L 为链表的长度。

代码实现

struct ListNode {int val;struct ListNode* next;
};
struct ListNode* findMiddleNode(struct ListNode* head) {struct ListNode *slow = head, *fast = head;while (fast != NULL && fast->next != NULL) {slow = slow->next;fast = fast->next->next;}return slow;
}

总结

本文介绍了在未知长度的单链表中快速找到中间节点的两种方法:普通方法和高级方法。普通方法虽然简单易懂,但其时间复杂度较高。相比之下,高级方法利用快慢指针,将时间复杂度降低到了 O(L),更为高效。在实际面试中,掌握这两种方法将对您解决链表问题大有裨益。

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

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

相关文章

Nginx -2

接着上文写 5.4.7 验证模块 需要输入用户名和密码 模块名称&#xff1a;ngx_http_auth_basic_module 访问控制基于模块 ngx_http_auth_basic_module 实现&#xff0c;可以通过匹配客户端资源进行限制 语法&#xff1a; Syntax: auth_basic string | off; Default: auth_ba…

威尔金森功分器基本原理学习笔记

威尔金森功分器基本原理 威尔金森功率分配器的功能是将输入信号等分或不等分的分配到各个输出端口&#xff0c;并保持相同输出相位。环形器虽然有类似功能&#xff0c;但威尔金森功率分配器在应用上具有更宽的带宽。微带形功分器的电路结构如图所示&#xff0c;其中&#xff0…

【OpenAI Sora】何时开放使用?付费课程已上线(sora什么时候开放使用 )

Sora何时开放使用 根据提供的信息&#xff0c;Sora目前还未对广大用户开放。OpenAI在2024年2月15日展示了Sora的视频&#xff0c;但没有设立等待名单或提供API访问。Sora仍在开发中&#xff0c;正在接受安全测试&#xff0c;并且尚未向公众开放使用。 付费课程已上线 根据最…

Vue图片浏览组件v-viewer,支持旋转、缩放、翻转等操作

Vue图片浏览组件v-viewer&#xff0c;支持旋转、缩放、翻转等操作 之前用过viewer.js&#xff0c;算是市场上用过最全面的图片预览。v-viewer&#xff0c;是基于viewer.js的一个图片浏览的Vue组件&#xff0c;支持旋转、缩放、翻转等操作。 基本使用 安装&#xff1a;npm安装…

费舍尔FISHER金属探测器探测仪维修F70

美国FISHER LABS费舍尔地下金属探测器&#xff0c;金属探测仪等维修&#xff08;考古探金银铜探宝等仪器&#xff09;。 费舍尔F70视听目标ID金属探测器&#xff0c;Fisher 金属探测器公司成立于1931年&#xff0c;在实验条件很艰苦的情况下&#xff0c;研发出了地下金属探测器…

【Python】实现一个类似于Glass2k的Windows窗口透明化软件

一 背景说明 网上看到一款Windows下的窗口透明化工具Glass2k&#xff08;Glass2k官网&#xff09;&#xff0c;可以简单地通过快捷键实现任意窗口的透明化&#xff0c;还挺方便的&#xff0c;想用Python自己实现一下类似的功能。 软件已经开源到&#xff1a;窗口透明化小工具开…

【Leetcode】889. 根据前序和后序遍历构造二叉树

文章目录 题目思路代码结果 题目 题目链接 给定两个整数数组&#xff0c;preorder 和 postorder &#xff0c;其中 preorder 是一个具有 无重复 值的二叉树的前序遍历&#xff0c;postorder 是同一棵树的后序遍历&#xff0c;重构并返回二叉树。 如果存在多个答案&#xff0c;…

CSS基础属性

【三】基础属性 【1】高度和宽度 &#xff08;1&#xff09;参数 width&#xff08;宽度&#xff09;&#xff1a;用于设置元素的宽度。可以使用具体的数值&#xff08;如像素值&#xff09;或百分比来指定宽度。 height&#xff08;高度&#xff09;&#xff1a;用于设置元…

Kubernetes 卷存储 NFS | nfs搭建配置 原理介绍 nfs作为存储卷使用

目录 1、NFS介绍2、NFS服务部署2.1安装nfs服务 (服务端配置)2.2启动NFS服务2.3 服务检查2.4 客户端配置 3、nfs作为存储卷使用3.1 nfs作为volume3.2 nfs存储的缺点3.3 nfs作为PersistentVolum 4、nfs作为动态存储提供5、总结 1、NFS介绍 NFS&#xff08;Network File System&a…

4.pom文件介绍Maven常用命令

1.pom.xml文件介绍. 1.1project标签和modelVersion标签介绍. pom.xml文件是maven的核心文件&#xff0c;POM(Project Object Model&#xff0c;项目对象模型)定义了项目的基本信息&#xff0c;用于描述如何构建&#xff0c;声明项目依赖;&#xff1b; 1.2依赖坐标介绍. 依赖的…

得物面试:Kafka消息0丢失,如何实现?

得物面试&#xff1a;Kafka消息0丢失&#xff0c;如何实现&#xff1f; 尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面…

新版Java面试专题视频教程——多线程篇②

新版Java面试专题视频教程——多线程篇② 0. 问题汇总0.1 线程的基础知识0.2 线程中并发安全0.3 线程池0.4 使用场景 1.线程的基础知识2.线程中并发锁3.线程池3.1 说一下线程池的核心参数&#xff08;线程池的执行原理知道嘛&#xff09;3.2 线程池中有哪些常见的阻塞队列Array…

高级语言期末2014级A卷

1.编写函数 int delarr(int a[] ,int n)&#xff0c;删除有n个元素的正整型数组a中所有素数&#xff0c;要求&#xff1a; 1&#xff09;数组a中剩余元素保持原来次序&#xff1b; 2&#xff09;将处理后的数组输出&#xff1b; 3&#xff09;函数值返回剩余元素个数&#xff1…

MySQL索引面试题(高频)

文章目录 前言什么时候需要&#xff08;不需要&#xff09;)使用索引&#xff1f;有哪些优化索引的方法前缀索引优化索引覆盖优化索引失效场景 总结 前言 今天来讲一讲 MySQL 索引的高频面试题。主要是针对前一篇文章 MySQL索引入门&#xff08;一文搞定&#xff09;进行查漏补…

虚拟机的内存结构

一、摘要 熟悉 Java 语言特性的同学都知道&#xff0c;相比 C、C 等编程语言&#xff0c;Java 无需通过手动方式回收内存&#xff0c;内存中所有的对象都可以交给 Java 虚拟机来帮助自动回收&#xff1b;而像 C、C 等编程语言&#xff0c;需要开发者通过代码手动释放内存资源&…

MedicalGPT 训练医疗大模型,实现了包括增量预训练、有监督微调、RLHF(奖励建模、强化学习训练)和DPO(直接偏好优化)

MedicalGPT 训练医疗大模型&#xff0c;实现了包括增量预训练、有监督微调、RLHF(奖励建模、强化学习训练)和DPO(直接偏好优化)。 MedicalGPT: Training Your Own Medical GPT Model with ChatGPT Training Pipeline. 训练医疗大模型&#xff0c;实现了包括增量预训练、有监督微…

Linux第63步_为新创建的虚拟机添加必要的目录和安装支持linux系统移植的软件

1、创建必要的目录 1)、创建“/home/zgq/linux/”目录 打开终端&#xff0c;进入“/home/zgq/”目录 输入“mkdir linux回车”&#xff0c;创建“/home/zgq/linux/”目录 输入“ls回车”&#xff0c;列举“/home/zgq/”目录的所有文件和文件夹 创建好“/home/zgq/linux/”…

EIS(防抖):meshflow算法 C++实现

视频防抖的应用 对视频防抖的需求在许多领域都有。 这在消费者和专业摄像中是极其重要的。因此&#xff0c;存在许多不同的机械、光学和算法解决方案。即使在静态图像拍摄中&#xff0c;防抖技术也可以帮助拍摄长时间曝光的手持照片。 在内窥镜和结肠镜等医疗诊断应用中&…

Go 中的 init 如何用?它的常见应用场景有哪些呢?

嗨&#xff0c;大家好&#xff01;我是波罗学。本文是系列文章 Go 技巧第十六篇&#xff0c;系列文章查看&#xff1a;Go 语言技巧。 Go 中有一个特别的 init() 函数&#xff0c;它主要用于包的初始化。init() 函数在包被引入后会被自动执行。如果在 main 包中&#xff0c;它也…

QT基本组件

四、基本组件 Designer 设计师&#xff08;重点&#xff09; Qt包含了一个Designer程序&#xff0c;用于通过可视化界面设计开发界面&#xff0c;保存文件格式为.ui&#xff08;界面文件&#xff09;。界面文件内部使用xml语法的标签式语言。 在Qt Creator中创建文件时&#xf…