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

数据结构 | 证明链表环结构是否存在

在这里插入图片描述
❤个人主页:

链表环结构

  • 0.前言
  • 1.环形链表(基础)
  • 2.环形链表Ⅱ(中等)
  • 3.证明相遇条件及结论
    • 3.1 问题1特殊情况证明
    • 3.2 问题1普适性证明

在这里插入图片描述

0.前言

在这篇博客中,我们将深入探讨链表环结构的检测方法:
Floyd算法的原理:如何通过快慢指针检测环?
环入口的定位:如何找到环的起点?
通过这篇博客,我会对链表中的环结构进行相关证明解释,总结学习。

1.环形链表(基础)

题目链接:https://leetcode.cn/problems/linked-list-cycle/description/

题目描述:
在这里插入图片描述
代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 
bool hasCycle(struct ListNode *head) {
    struct ListNode*slow,*fast;
    slow = fast = head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;

          if(slow==fast)
             return true;
    }
    return false;
}

代码解释:

这个题目的实现逻辑比较简单,我们定义快慢指针来进行实现,fast指针每次走2步,slow指针每次走1步,当快指针和慢指针相遇的时候,如果链表中存在环,则返回 true 。否则,返回 false。

2.环形链表Ⅱ(中等)

题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/
题目描述:
在这里插入图片描述

代码实现1:

struct ListNode* detectCycle(struct ListNode* head) {
    struct ListNode* fast;
    struct ListNode* slow;
    fast = slow = head;

    while (fast && fast->next)
    {
        //快慢指针依次走
        slow = slow->next;
        fast = fast->next->next;

        if (slow == fast)
        {
            struct ListNode* start = head;
            struct ListNode* meet = slow;
            while (meet != start)
            {
                meet = meet->next;
                start = start->next;
            }
            return meet;
        }
    }
    return NULL;
}


代码解释1:

在这里插入图片描述

代码实现2:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    struct ListNode* tailA=headA,*tailB=headB;
    int lenA=1,lenB=1;

    while(tailA)
    {
        tailA=tailA->next;
        ++lenA;
    }
    while(tailB)
    {
        tailB=tailB->next;
        ++lenB;
    }

    int gap=abs(lenA-lenB);
    struct ListNode* longlist=headA,*shortList=headB;

    if(lenA<lenB)
    {
        longlist=headB;
        shortList=headA;
    }

    while(gap--)
    {
        longlist=longlist->next;
    }

    while(longlist!=shortList)
    {
        longlist=longlist->next;
        shortList=shortList->next;
    }
    return longlist;

}

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode* fast;
    struct ListNode* slow;
    fast=slow=head;

    while(fast&&fast->next)
    {
        //快慢指针依次走
        slow=slow->next;
        fast=fast->next->next;

        if(slow==fast)
        {
            //转换成求交点
            struct ListNode* meet=slow;
            struct ListNode* lt1=meet->next;
            struct ListNode* lt2=head;
            meet->next=NULL;
            return getIntersectionNode(lt1,lt2);
        }
    }
    return NULL;
}

代码解释2:
在这里插入图片描述

3.证明相遇条件及结论

3.1 问题1特殊情况证明

问题1: 为什么slow走1步,fast走2步,他们会相遇吗?会不会错过?请证明
在这里插入图片描述

3.2 问题1普适性证明

问题:为什么slow走1步,fast走3步(x>=3),他们会相遇吗?会不会错过?请证明
在这里插入图片描述

感谢您的阅读支持!!!
后续会持续更新的!!!
文末投票支持一下!!!

在这里插入图片描述

http://www.dtcms.com/a/123318.html

相关文章:

  • ubuntu设备磁盘空间不足 处理办法
  • WinForm真入门(12)——RadioButton控件详解
  • C++中static与private继承关系解析
  • Soybean Admin 使用tv-focusable兼容电视TV端支持遥控器移动焦点
  • 智能体代理模式(Agent Agentic Patterns)深度解析
  • C盘清理技巧分享
  • 期权与期货的在险价值
  • SmolDocling:一种超紧凑的视觉语言模型,用于端到端多模态文档转换
  • SpringBoot接口覆盖上一次调用的实现方案
  • kafka生产者partition数量和消费者数量的关系
  • APIGen-MT:高效生成多轮人机交互Agent数据的两阶段框架
  • VCode 的 .S 汇编文件里面的注释不显示绿色
  • [数据结构]排序
  • 深度剖析丝杆升降机的蜗杆精度要求等级​
  • 【Pandas】pandas DataFrame to_numpy
  • 微店商品属性参数接口
  • 百度地图小区边界爬取
  • 从PPT到PNG:Python实现的高效PPT转图工具
  • Edge浏览器IE兼容模式设置
  • JavaScript(JS进阶)
  • 【AI论文】OmniSVG:一种统一的(可扩展)矢量图形生成模型
  • STM32单片机入门学习——第31节: [10-1] I2C通信协议
  • 需求开发与需求管理的全景解析
  • 4.10学习总结
  • MQTT:基于Keil开发工具移植入MQTTClient-C开源库
  • JS—同源策略:2分钟掌握同源策略
  • vue2添加背景水印-手动实现(无组件模式)
  • 4月10(信息差)
  • linux系统下如何提交git和调试
  • +++++背到厌倦。持续更新