链表刷题常用技巧——快慢指针

这篇具有很好参考价值的文章主要介绍了链表刷题常用技巧——快慢指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

链表刷题常用技巧——快慢指针,神魔炼体-刷题,数据结构与算法,链表,数据结构,leetcode

强大,不动如山的强大,不会输给自己的真正的强大。 

往期回顾:

数据结构——单链表

单链表力扣刷题

文章目录

经典例题:链表的中间结点

题目分析及双指针思路引入 

双指针图解

leetcode 核心代码

判断环形链表——快慢指针延伸为追及问题

题目分析,图解

leetcode 核心代码


  大家好,我是纪宁。

  数据结构链表部分的面试、笔试大多都是在单链表部分,且大多题都是没有哨兵位的头结点,题目相数组通常比较难。这篇文章就给大家介绍一个单链表这里做题的常用技巧——快慢指针。

  所谓快慢指针,就是有两个指针来维护单链表,通常定义为 slow 和 fast ,这两个指针遍历链表的速度不同。

经典例题:链表的中间结点

  给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。链表刷题常用技巧——快慢指针,神魔炼体-刷题,数据结构与算法,链表,数据结构,leetcode

题目分析及双指针思路引入 

  在这个题中,如果要找的是数组中间元素的话,可能比较简单,直接计算出数组大小,再规定只遍历一半的内容即可。但是在链表,你除了知道当前结点的内容和下一节点的地址,一无所知,所以不能控制指针走的位置。

  有一个特别巧妙的方法,就是定义两个指针,一个指针 slow 每次向后走一步, slow =slow->next;一个指针每次向后走两步,fast = fast -> next ->next ,这样,当指针 fast 或者 fast-> next 成为 NULL 指针的时候,slow 指针恰好走到了链表中间的位置,这样,就找到了链表的中间结点。

双指针图解

当链表长度为奇数时

链表刷题常用技巧——快慢指针,神魔炼体-刷题,数据结构与算法,链表,数据结构,leetcode

当链表长度为偶数时 

 链表刷题常用技巧——快慢指针,神魔炼体-刷题,数据结构与算法,链表,数据结构,leetcode

leetcode 核心代码

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

  代码中要注意的一点是,因为fast 指针一次走‘两步’,所以循环的终止条件是 fast 或者 fast-> next 为空,最后返回 slow 指针。

判断环形链表——快慢指针延伸为追及问题

题目:给你一个链表的头节点 head ,判断链表中是否有环。

  如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

链表刷题常用技巧——快慢指针,神魔炼体-刷题,数据结构与算法,链表,数据结构,leetcode

链表刷题常用技巧——快慢指针,神魔炼体-刷题,数据结构与算法,链表,数据结构,leetcode

链表刷题常用技巧——快慢指针,神魔炼体-刷题,数据结构与算法,链表,数据结构,leetcode

题目分析,图解

链表刷题常用技巧——快慢指针,神魔炼体-刷题,数据结构与算法,链表,数据结构,leetcode

  如图:上面这个链表就是在 d3 进入环,d6的指针域指向d3,然后链表就会在 d3——d4——d5——d6——d3 这个环中循环。

  首先,这道题没有给出进入环的位置,所以进环有很多种可能,这就排除了遍历链表的想法。这道题也可以使用快慢指针的方法,fast 指针和 slow 指针同时开始从头指针往后走,fast指针每次走两步,slow指针每次走1步,看这两个指针能否相遇。

链表刷题常用技巧——快慢指针,神魔炼体-刷题,数据结构与算法,链表,数据结构,leetcode

  如果链表带环,则快指针和慢指针一定会相遇,否则就不会相遇。这个追击原理类似于和你女朋友一起去操场跑圈,你们同时出发,只要你跑的比她快,并且你们在相遇前都不停,就一定能实现套圈。 

链表刷题常用技巧——快慢指针,神魔炼体-刷题,数据结构与算法,链表,数据结构,leetcode

  所以,只要在指针 fast 和 指针 slow 往后走的时候,发现他们的指向相同(fast==slow)的时候,就说明链表带环(套圈了)。如果fast 或 fast->next 为空,说明链表遍历已经结束,链表不带环。 

leetcode 核心代码

bool hasCycle(struct ListNode *head) {
    struct ListNode *slow=head;
    struct ListNode *fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(fast==slow)
            return true;
    }
    return false;
}

  这就是博主给大家带来的单链表部分刷题的常用技巧——快慢指针,感谢观看。

链表刷题常用技巧——快慢指针,神魔炼体-刷题,数据结构与算法,链表,数据结构,leetcode文章来源地址https://www.toymoban.com/news/detail-621481.html

到了这里,关于链表刷题常用技巧——快慢指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode力扣】234 快慢指针 | 反转链表 | 还原链表

      目录 1、题目介绍 2、解题思路 2.1、暴力破解法 2.2、快慢指针反转链表   原题链接:  234. 回文链表 - 力扣(LeetCode) 示例 1: 输入: head = [1,2,2,1] 输出: true  示例 2: 输入: head = [1,2] 输出: false  提示:  链表中节点数目在范围[1, 10^5] 内 0 = Node.val = 9 进阶: 你能否用

    2024年02月08日
    浏览(31)
  • 【Java|golang】143. 重排链表---快慢指针

    给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 输入:head = [1,2,3,4] 输出:[1,4,2,3] 示例 2: 输入:

    2024年02月14日
    浏览(25)
  • 环形链表 II(力扣142)(快慢指针)

    142.环形链表—力扣 给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到

    2023年04月25日
    浏览(28)
  • 快慢指针该如何操作?本文带你认识快慢指针常见的三种用法及在链表中的实战

    很多同学都听过 快慢指针 这个名词,认为它不就是定义两个引用(指针)一前一后吗?是的,它的奥秘很深,它的作用究竟有哪些?究竟可以用来做哪些题目?下面我将一一带你了解和应用 下面的本节的大概内容,有疑惑的点,欢迎小伙伴们留言 目录 1.简述快慢指针 2.快慢

    2024年02月04日
    浏览(28)
  • 【C/C++数据结构】链表与快慢指针

    目录 一、单链表 二、双向循环链表 三、判断链表是否带环 四、链表的回文结构判断 五、复制带随机指针的链表 优点 :头部增删效率高,动态存储无空间浪费 缺点 :尾部增删、遍历效率低,不支持随机访问节点 头结点 :单链表头结点可有可无,带头结点更方便进行初始

    2024年02月16日
    浏览(31)
  • 力扣hot100 环形链表 快慢指针 哈希 数学公式

    Problem: 142. 环形链表 II 👨‍🏫 参考题解 ⏰ 时间复杂度: O ( n ) O(n) O ( n ) 🌎 空间复杂度: O ( 1 ) O(1) O ( 1 )

    2024年01月23日
    浏览(33)
  • 力扣2095.删除链表的中间节点(java快慢指针)

    Problem: 2095. 删除链表的中间节点 利用快慢指针,快指针每次走两步,慢指针每次走一步(循环退出条件是fast指针不为空同时fast.next不为空),但是我们容易发现这样到最后slow指针正好指向我们需要删除的节点,由于没有前指针,这样我们不便操作。此时可以借助虚拟头节点

    2024年02月06日
    浏览(33)
  • LeetCode - 142. 环形链表 II (C语言,快慢指针,配图)

            如果你对快慢指针,环形链表有疑问,可以参考下面这篇文章,了解什么是环形链表后,再做这道题会非常简单,也更容易理解下面的图片公式等。 LeetCode - 141. 环形链表 (C语言,快慢指针,配图)-CSDN博客         上述文章总结: 如果一个链表是环形链表,采用

    2024年02月05日
    浏览(39)
  • 【每日一题Day281】LC142链表 Ⅱ| 快慢指针 哈希表

    环形链表 Ⅱ【LC142】 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(

    2024年02月15日
    浏览(47)
  • 算法刷题营【Day1】:: 27. 移除元素:快慢指针在顺序表中的应用与相关刷题

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:27. 移除元素 2. 题解参考 3. 题解思路 4. 相关题 [ - - 4.1 26. 删除有序数组中的重复项 ] [ - - 4.1 283. 移动零 ] 5. 相关题题解及简要思路 - - 5.1 26. 删除有序数组中的重复项 - - 5.1 283. 移动

    2024年02月06日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包