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

深入链表的遍历——快慢指针算法(LeetCode——876题)

今天我们一起来学习一下一个快速遍历链表的方法

我们先来看看一道经典的需要遍历链表的题目 (题目来自LeetCode)

876. 链表的中间结点icon-default.png?t=O83Ahttps://leetcode.cn/problems/middle-of-the-linked-list/

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

普通方法

    public ListNode middleNode(ListNode head) {ListNode dummy = new ListNode(0, head);ListNode current = dummy;int sum=0;while(current.next!=null){sum++;current=current.next;}for(int i=0;i<sum/2;i++){dummy=dummy.next;}return dummy.next;}

第一个循环遍历了整个链表来计算链表的长度(存储在变量 sum 中)。这个循环的时间复杂度是 O(n),因为它必须访问链表中的每个节点一次。 

第二个循环根据链表的长度的一半(sum / 2)再次遍历链表,直到到达中间节点。虽然这个循环看起来像是减少了遍历的次数(因为它只遍历了链表的一半),但由于第一个循环已经遍历了整个链表,所以总体时间复杂度仍然是 O(n)。 

快慢指针算法 

    public ListNode middleNode(ListNode head) {ListNode slow=head;ListNode fast=head;while(fast!=null &&fast.next!=null){fast=fast.next.next;slow=slow.next;}return slow;}

在这个优化版本中,我们使用两个指针,一个快指针(fast)和一个慢指针(slow)。快指针每次移动两步,而慢指针每次移动一步。当快指针到达链表末尾(或倒数第二个节点,如果链表长度为奇数)时,慢指针正好位于链表的中间。这种方法的时间复杂度为O(n),但因为它只遍历链表一次,所以比原来的方法更高效。 

对比 

虽然两个方法的时间复杂度都是 O(n),但是实际上普通方法需要遍历n次来计算长度,然后再遍历n/2次来找到中间节点,总共是1.5n次。而快慢指针算法只需要遍历n次就找到了中间节点。在面对大量的数据时,还是有些许的优势的。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Facebook的虚拟现实功能简介:社交网络的新前沿
  • Qt与VS打包命令
  • 安全基础设施如何形成统一生态标准?OASA 硬件安全合作计划启动 | 2024 龙蜥大会
  • 医学数据分析实训 项目二 数据预处理作业
  • JVM 调优篇7 调优案例1-堆空间的优化解决
  • Selenium打开浏览器后闪退问题解决
  • AndroidManifest.xml文件的重要信息
  • 38900 机动车安全检测
  • 编译原理:第一章 引论
  • [XILINX] 正点原子ZYNQ7015开发板!ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2,性能强悍,资料丰富!
  • leetcode3.无重复字符的最长子串
  • 分块总结:时髦之裤
  • Redis相关命令详解
  • 数据的二进制形式
  • 计算机视觉学习路线
  • Apache Pulsar 2.1 重磅发布
  • Apache的基本使用
  • C++入门教程(10):for 语句
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • IOS评论框不贴底(ios12新bug)
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 服务器之间,相同帐号,实现免密钥登录
  • 基于web的全景—— Pannellum小试
  • 将回调地狱按在地上摩擦的Promise
  • 区块链技术特点之去中心化特性
  • 如何进阶一名有竞争力的程序员?
  • 世界上最简单的无等待算法(getAndIncrement)
  • 系统认识JavaScript正则表达式
  • 小程序01:wepy框架整合iview webapp UI
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​iOS实时查看App运行日志
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​虚拟化系列介绍(十)
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $.ajax,axios,fetch三种ajax请求的区别
  • (7)摄像机和云台
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (六)c52学习之旅-独立按键
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (轉)JSON.stringify 语法实例讲解
  • .Net MVC + EF搭建学生管理系统
  • .NET 依赖注入和配置系统
  • .Net 知识杂记
  • .Net 中Partitioner static与dynamic的性能对比
  • .net 中viewstate的原理和使用
  • .NET企业级应用架构设计系列之结尾篇
  • .考试倒计时43天!来提分啦!
  • /etc/motd and /etc/issue