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

数据结构 【带环单链表】

        在单链表中可能会存在一种情况,某一结点在经过几次转移之后回到了自己本身,这种情况就称之为带环链表。对于带环链表,我们不能轻易对其进行遍历,遍历可能会导致产生死循环。

带环链表的逻辑图如下所示:(这里只展示一种简单情况)

        如何判断一个链表带环是在面试过程中常见的问题,这里介绍一个利用快慢指针检测链表是否带环的方法。主要思路如下:

         代码实现:

bool hasCycle(struct ListNode *head) {
    struct ListNode* fast = head,*slow = head;
    while(fast && fast->next)//没有环fast或fast->next必为NULL
    {
        slow = slow->next;
        fast = fast->next->next;
        if(fast == slow)
            return true;
    }
    return false;
    
}

        上述思路衍生出来的问题:

        1、fast每次移动2步为什么能确保一定和slow相遇?

        假设fast和slow都进入了环,且fast和slow之间的距离为N,fast每次移动2步,slow每次移动1 步。那么两个指针都移动一次之后的距离变为:N-1;每移动一次之后的距离就会缩小1步,只要链表的环存在,那么N-1开始递减变成N-2,N-3,......2,1,0. 距离变为0时fast和slow相遇。

        2、fast每次移动2步以上能不能相遇?

        假设fast和slow都进入了环,且fast和slow之间的距离为N,fast每次移动3步,slow每次移动1 步。那么在每次移动一次之后它们之间的相对距离就会每次减少2步。那么距离开始从N开始递减:N,N-2 , N-4 ...... N能不能递减到0取决于N本身,假设N为奇数那么距离就不可能递减成0,假设N为偶数,那么就可以递减成0。所以,fast和slow就有可能相遇,也有可能一直不能相遇。

        3、slow每次走2步,fast走3步能不能相遇呢?

        这种情况也是可以相遇的,我们只要保证fast和slow的相对移动位置保持在1步就可以。

 


http://www.kler.cn/a/402512.html

相关文章:

  • 【Chatgpt】如何通过分层Prompt生成更加细致的图文内容
  • Android开发实战班 - 数据持久化 - Room 数据库应用
  • Spark Catalyst 优化器具有高度的可扩展性,如何自定义优化规则?
  • Zero-Shot Next-Item Recommendation using Large Pretrained Language Models-问题咨询
  • 阿里云 DevOps 资源安全扫描实践
  • nginx配置不缓存资源
  • Spark SQL大数据分析快速上手-完全分布模式安装
  • LLM( Large Language Models)典型应用介绍 1 -ChatGPT Large language models
  • 3_Flink CDC
  • Eagle-OJ 开源的在线编程训练平台
  • Mybatis框架之适配器模式 (Adapter Pattern)
  • ReactPress:基于pnpm的Mono Repository方案介绍
  • Docker用法详解
  • Docker-Compose 快速部署安装 Nginx 或其他应用
  • uniapp页面样式和布局和nvue教程详解
  • 2020 年 9 月青少年软编等考 C 语言三级真题解析
  • Django实现智能问答助手-进一步完善
  • Go(java基础)
  • AI 赋能电商的未来:购物推荐、会员分类与智能定价的创新实践
  • 2. SpringBoot + MQTT 门禁设备对接实战