快慢指针该如何操作?本文带你认识快慢指针常见的三种用法及在链表中的实战

很多同学都听过快慢指针这个名词,认为它不就是定义两个引用(指针)一前一后吗?是的,它的奥秘很深,它的作用究竟有哪些?究竟可以用来做哪些题目?下面我将一一带你了解和应用

下面的本节的大概内容,有疑惑的点,欢迎小伙伴们留言

目录

1.简述快慢指针

2.快慢指针实战讲解

1.求链表的中间结点

2.链表中倒数第k个结点

3.删除排序链表中的所有重复元素

3.题型于快慢指针的小总结


1.简述快慢指针

(1)快慢指针只是一种说法,不是直接定义两个指针;在Java中就没有指针这个概念

(2)快慢指针定义两个引用,一般慢指针定义为slow,快指针定义为fast

(3)快慢指针常见的思想:

1.一般快指针所指向的对象需要满足某个条件,慢指针才能继续向前走

2.快慢指针一起走,但是每次快指针走的距离都比慢指针多

3.快指针先走n步,然后快慢指针再一起走

(4)常应用于数组和链表中

2.快慢指针实战讲解

下面带你一步一步学会快慢指针在链表中的应用,它是怎么运用的和应用

1.求链表的中间结点

(1)这是一道leetcode上面的题目,下面附上链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

不想点进去的同学也不要慌张,下面我展示题目:

(2)理解题目

第一、这是单链表的题目 

第二、本题给的例子有两个:第一个是结点数是奇数的时候,第二个是结点数是偶数的时候,用数学公式表示就是:中间结点=结点个数/2(规定第一个结点下标为0)

第三、题目要求:找到中间的结点,并返回中间结点

下面讲解这种题的解法

(3)暴力解法(不推荐)

很多同学是这么想的,要求中间结点,首先要知道中间结点的位置不就好了;然后先遍历一遍链表,记下结点的个数,算出中间结点的位置;再遍历第二遍,遍历到中间位置就停下。

缺点:缺点很明显,时间复杂度太大,如果题目要求时间复杂度为O(n),也就是只遍历一遍链表,就找出中间结点,同学该如何应对。

下面介绍本节的重点算法思想:快慢指针
(4)利用快慢指针巧解(重点)

我们再看一下题目:下面分为五步去讲解

第一步:定义两个引用指向头结点

ListNode slow = head;//慢指针
ListNode fast = head;//快指针

第二步:怎么操作?

我们规定每次,快指针走两步,慢指针走一步,当快指针停下来的时候,慢指针指向的结点就是中间结点

原理剖析:

第三步:代码演示

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

第四步:快指针走完的判断条件

fast != null && fast.next != null

看条件有两种,就是对应结点数是奇数或偶数的情况 

奇数(条件一:fast.next != null)

偶数(条件二:fast != null)

第五步:判断特殊情况

当一个头结点都没有的时候,也就是head==null,那还找个鸡毛,直接返回就好

 if(head == null) {
     return null;
 }  

完整代码:

public ListNode middleNode(ListNode head) {
        if(head == null) {
              return null;
        }  
        ListNode slow = head;
        ListNode fast = head;

        while(fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }

可见,使用快慢指针的效率是多么的快

2.链表中倒数第k个结点

(1)这是一道牛客网上面的题目,下面附上链接

链表中倒数第k个结点_牛客题霸_牛客网

下面附上题目:

(2)理解题目

第一、要求我们返回倒数某个结点,最后一个标号为倒数第一;

第二、题目在时间和空间上面都有限制,并且知识点里面有双指针的标签

(3)暴力求解(不推荐)

依旧是同样的套路,先遍历一遍链表,记录下结点的总数;利用结点总数-倒数某个结点,再遍历第二次链表就可以知道遍历到哪个位置便利用停下来。

这种方法的时间限制可能会超出题目的要求,也是不推荐的,下面介绍快慢指针的解法

(4)快慢指针思想(重点推荐)

第一步:定义一个fast和slow的引用,开始都指向头节点。

ListNode slow = head;
ListNode fast = head;

第二步:求倒数第K个结点,那就先让快指针(fast)先走(k-1)步

int count = k-1;//走k-1步
while(count > 0) {
    if(fast.next!=null) {
        fast = fast.next;
       count--;
   }else {
       return null;
   }
}

第三步:fast走完k-1步后,fast和slow一起走,当fast停下的时候,slow的位置就是所求的结点位置

  while(fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }

原理及终止条件:

特殊情况的考虑:

第四步:特殊情况考虑

当头结点为空时,也就是一个结点都没有的时候,直接返回null

 if(head == null) {
    return null;
}

当k的取值不合法时,比如是非正数,直接返回就好

if(k<=0) {
    return null;
}

完整代码:

 public ListNode FindKthToTail(ListNode head,int k) {
        if(head == null) {
            return null;
        }
        if(k<=0) {
            return null;
        }
        ListNode slow = head;
        ListNode fast = head;
        int count = k-1;
        while(count > 0) {
           if(fast.next!=null) {
             fast = fast.next;
            count--;
           }else {
            return null;
           }
        }
        while(fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }

        return slow;
    }

3.删除排序链表中的所有重复元素

(1)这也是一道力扣上面的题目,下面是连接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目样貌:

(2)理解题目

第一、这是一个已经排好序的单链表。

第二、使得这个单链表的每个值只出现一次,需要把重复出现的结点删掉。

(3)使用快慢指针求解

本题,我们依然选择一个快慢指针的思想,也就是前后指针,可以做到时间复杂度为O(n),也就是只遍历一遍链表就完成

核心思想:我们让快指针先走,如果快指针指向的值和慢指针指向的一样,那就继续往下走,直到指向的值不一样,再修改慢指针的指向,完成重复结点的删除。

第一步:定义快慢指针

 ListNode slow = head;
ListNode fast = head.next;

第二步:开始遍历链表

        while(fast != null) {
           while(fast != null && fast.val == slow.val) {
                fast = fast.next;
           }
           if(fast != null) {
                slow.next = fast;
           slow = fast;
           fast = fast.next; 
           }else {
               slow.next = null;
           }
        }
        return head;

代码分析:

  while(fast != null && fast.val == slow.val) {
        fast = fast.next;
  }

这个while循环是控制快指针,满足条件就继续往下走;出了这个while循环,有两种情况。

第一种:因为fast.val != slow.val而结束,并且没走完链表

 if(fast != null) {
     slow.next = fast;
     slow = fast;
     fast = fast.next; 
}

这种情况就需要连接快慢指针,从而达到删除重复结点的目的

第二种:fast == null,链表走完了

else {
   slow.next = null;
}

快指针走完了都没满足条件,说明slow后面的结点都是重复的结点

第三步:分析特殊情况

当结点是空的时候,不需要删除;当只有一个结点的时候,也不存在重复结点的情况

 if(head == null) {
      return null;
 }
 if(head.next == null) {
      return head;
  }

在时间效率上面,直接超越百分百


还有一道力扣题和这题的思路很相似,下面是链接,同学们可以先自己尝试

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目要求为:删除所有的key结点

3.快慢指针的小总结

(1)以上是快慢指针的三种常规用法,有的时候,也称为前后指针

(2)当题目中要求只遍历一遍链表,就应该想到快慢指针,一般只需要定义两个变量即可(快慢指针)

(3)当题目的要求有对链表的两头进行操作时,考虑求中间的结点

(4)使用快慢指针,要重点考虑它们的线性关系(分别走多少步)和结束条件


以上就是本节的全部内容了,同学们快去练手吧!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32 寄存器配置笔记——USART DMA发送

一、DMA介绍 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传 输。无须CPU干预&#xff0c;数据可以通过DMA快速地移动&#xff0c;这就节省了CPU的资源来做其他操作。当产品对于时序要求较严格时&#xff0c;外设使用DMA的方式能够减轻CPU负…

C++ 指针常量和常量指针的区别

指针常量 指针常量&#xff1a;顾名思义它就是一个常量&#xff0c;但是是指针修饰的。 格式为&#xff1a; int * const p //指针常量在这个例子下定义以下代码&#xff1a; int a&#xff0c;b&#xff1b; int * const p&a //指针常量 //那么分为一下两种操作 *p9;//操…

[笔记] 使用 qemu/grub 模拟系统启动(单分区)

背景 最近在学习操作系统&#xff0c;需要从零开始搭建系统&#xff0c;由于教程中给的虚拟机搭建的方式感觉还是过于重量级&#xff0c;因此研究了一下通过 qemu 模拟器&#xff0c;配合 grub 完成启动系统的搭建。 qemu 介绍 qemu 是一款十分优秀的系统模拟器&#xff0c;…

软件设计师——软件工程(一)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

【漏洞修复】Cisco IOS XE软件Web UI权限提升漏洞及修复方法

关于Cisco IOS XE软件Web UI权限提升漏洞及修复方法 文章目录 漏洞基本信息漏洞影响范围确认设备是否受影响漏洞修复方法推荐阅读 漏洞基本信息 Cisco IOS XE Unauthenticatd Remote Command Execution (CVE-2023-20198) (Direct Check) Severity:Critical Vulnerability Pri…

网络游戏APP备案|游戏

网络游戏APP备案|游戏 网络游戏备案分析需要备案原因&#xff08;个人看法&#xff09;对小公司对大公司 总结 网络游戏备案分析 相信做网络游戏的伙伴们在23年都收到了各个平台的公告&#xff0c;网络游戏需要进行APP的备案。也就是说网路游戏现在安卓平台也不是你想上架测试…

Shrio 安全框架

目录 前言 1.介绍 2.整合 Shiro 到 Spring Boot 3.Shiro 相关配置 总结 前言 几乎所有涉及用户的系统都需要进行权限管理&#xff0c;权限管理涉及到一个系统的安全。Spring Boot 的安全框架整合方案中还有一个璀璨的明珠&#xff1a;Shrio。 1.介绍 Shiro是一款由Java 编…

基于Qt的Live2D模型显示以及控制

基本说明 Live2D官方提供有控制Live2D模型的SDK,而且还提供了一个基于OpenGL的C项目Example,我们可以基于该项目改成Qt的项目&#xff0c;做一个桌面端的Live2D桌宠程序。 官方例子 经过改造效果如下图所示。 官方项目配置 下载官方提供的SDK例程,&#xff0c;选择Cubism …

2023 ACDU 中国行 · 西安站 | 数据库技术发展及实践

ACDU 中国行西安站由中国数据库联盟联合浪潮数据库等单位共同主办&#xff0c;特邀中国计算机学会&#xff08;CCF&#xff09;为本次活动的指导单位。 作为中国数据库联盟的品牌活动之一&#xff0c;【ACDU 中国行】在线下汇集数据库领域的行业知名人士&#xff0c;共同探讨数…

契约锁电子签章让合同起草、审查不再难

起草、审查合同是签约过程中最繁琐的环节之一。 小到筛选合同范本、确认并填写签署方信息、计算工资、服务费用或产品价格&#xff0c;大到合同条款审查、修改…总之想要呈现一份合规、双方满意的合同文书常常消耗大量时间和精力&#xff0c;事倍功半。 销售刚刚和客户确认订单…

Excel往Word复制表格时删除空格

从Excel复制到word&#xff0c;复制后&#xff0c;前面出现了空格 原因&#xff1a;这个空白是缩进 方法&#xff1a;先将缩进转为空格&#xff0c;再将空格删除 第一步&#xff1a;选中表格&#xff0c;如下操作 第二步&#xff1a;选中表格&#xff0c;排版&#xff0c;将…

ftp传海量文件会卡?跨境数据传输推荐使用FTP吗?

企业在传输大量文件时&#xff0c;经常会遇到FTP卡顿的问题&#xff0c;尽管采取多种方式仍无法完美解决&#xff0c;尤其是在跨境数据传输方面。对于紧急项目而言&#xff0c;文件数据无法及时同步可能导致任务无法按时完成。在传输速度方面&#xff0c;甚至可能出现每秒几KB的…

医院HIS系统慢和卡顿网络流量分析

分析背景 近期医院的医生使用HIS系统的时候&#xff0c;经常出现系统慢和卡顿现象。经过交流得知医生在点击一个页面&#xff0c;需要等很久才能加载出来&#xff0c;且对于开药这种的操作&#xff0c;医生需要点每个大类去找到对应的药&#xff0c;每点一次都需要等一会儿才能…

BearPi Std 板从入门到放弃 - 先天神魂篇(1)(RT-Thread 指令点亮LED)

简介 使用 BearPi IOT Std板&#xff0c; 开发板简单信息 主芯片: STM32L431RCT6 串口: Usart1 USER LED : PC13 E53_SC1 扩展板与主板连接: I2C : I2C1 (光照强度传感器&#xff1a;BH1750) LED: PB9RT-Thread 创建线程 线程的管理方式 添加用户代码 main.c #include <…

Java爬虫攻略:应对JavaScript登录表单

问题背景 在进行网络抓取数据时&#xff0c;经常会遇到需要登录的网站&#xff0c;特别是使用JavaScript动态生成登录表单的情况。传统的爬虫工具可能无法直接处理这种情况&#xff0c;因此需要一种能够模拟用户行为登录的情况解决方案。 在实际项目中&#xff0c;我们可能需要…

uniapp-实现一级二级职位选择,完整页面!!!

一、需求 该页面实现的功能有&#xff1a; 该页面是左侧为一级&#xff0c;右侧为二级&#xff1b;可以搜索职位进行选择&#xff1b;底部显示已选的岗位&#xff0c;点击每一项会删除&#xff1b;右侧的二级岗位&#xff0c;点击时会选中&#xff0c;再次点击会取消&#xf…

AI数字人在tiktok平台开播教程!

AI数字人作为一种虚拟形象的代表&#xff0c;正在逐渐走进人们的生活。在小红书这样的短视频平台上&#xff0c;AI数字人也有机会开展直播活动&#xff0c;展示自己的个性魅力&#xff0c;也可以进行直播带货&#xff01; 数字人在淘宝购物平台开播原理 &#xff08;1&#xff…

[UNILM]论文实现:Unified Language Model Pre-training for Natural Language.........

文章目录 一、完整代码二、论文解读2.1 介绍2.2 架构2.3 输入端2.4 结果 三、过程实现四、整体总结 论文&#xff1a;Unified Language Model Pre-training for Natural Language Understanding and Generation 作者&#xff1a;Li Dong, Nan Yang, Wenhui Wang, Furu Wei, Xia…

【docker】容器使用(Nginx 示例)

查看 Docker 客户端命令选项 docker上面这三张图都是 常用命令&#xff1a; run 从映像创建并运行新容器exec 在运行的容器中执行命令ps 列出容器build 从Dockerfile构建映像pull 从注册表下载图像push 将图像上载到注册表…

深度学习 Day10——T10数据增强

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;3.导入数据4.查…