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

【数据结构】环形链表

   

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

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

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

示例 1:

                

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

                                

                 

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

思路解析:

        运用快慢指针问题,将其转换成一个追击问题

快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表其实位置开始运行,如果链表带环则一定会在环中相遇,否则快指针率先走到链表的末尾。

代码解析:

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;
}

扩展问题:

1.为什么slow走一步,fast走两步他们会相遇?会不会错过?请证明

               

2.为什么slow走一步,fast走X(X>2)步他们会相遇?会不会错过?请证明

        

        给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

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

        

 示例 1:

                

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

        

输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

        

   

输入:head = [1], pos = -1
输出:返回 null
解释:链表中没有环。

 代码解析:

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

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

思路解析:

                

 代码解析:

        

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

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


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

相关文章:

  • 【Spring事务】深入浅出Spring事务从原理到源码
  • 【JavaEE初阶】线程 和 thread
  • electron-vite【实战系列教程】
  • python web app开发
  • Restaurants WebAPI(二)——DTO/CQRS
  • EGO Swarm翻译
  • 大数据模型、离线架构、实时架构
  • Qt实践项目:仿Everything软件实现一个QtEverything
  • 提高曝光率:外贸网站如何充分利用谷歌优化赢得客户
  • C++成神之路 | 第一课【步入C++的世界】
  • 23种设计模式
  • Linux第一个小程序git三板斧
  • 【28】Verilog进阶 - RAM的实现
  • JAVA开发(自研项目的开发与推广)
  • BeanPostProcessor原理分析
  • Flutter内阴影
  • 人脸识别经典网络-MTCNN(含Python源码实现)
  • 深度学习(22):如何判断训练过程中深度学习模型损失值不再下降
  • Java语言-----类与对象的秘密
  • vue2和vue3中路由的区别和写法?
  • Django(一)安装
  • 计算机网络(第十二弹) --- 传统访问过程与 CDN 访问过程对比
  • 【华为OD机试真题JAVA】水仙花数问题
  • 数据仓库相关面试题
  • Ubuntu安装rancher2.6的k8s集群手册
  • 程序员必须知道的HTML常用代码有哪些?