返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >如何通过C++求出链表中环的入口结点
  • 659
分享到

如何通过C++求出链表中环的入口结点

2024-04-02 19:04:59 659人浏览 泡泡鱼
摘要

目录题目描述:输入描述:返回值描述:示例:解题思路:测试代码:题目描述: 给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。 数据范围: n≤1000

题目描述:

给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。

数据范围: n≤10000,1<=结点值<=10000

要求:空间复杂度 O(1),时间复杂度 O(n)

例如,输入{1,2},{3,4,5}时,对应的环形链表如下图所示:

可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。

输入描述:

输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台会根据第二段是否为空将这两段组装成一个无环或者有环单链表

返回值描述:

返回链表的环的入口结点即可,我们后台程序会打印这个结点对应的结点值;若没有,则返回对应编程语言的空结点即可。

示例:

输入:

{1,2},{3,4,5}

返回值:

3

说明:

返回环形链表入口结点,我们后台程序会打印该环形链表入口结点对应的结点值,即3

解题思路:

本题考察数据结构链表的使用,有两种解法。

  1. 哈希Set。用容器哈希Set遍历存储指针,当某次存储发现容器中已有该指针,说明此时已经到了环形链表入口。
  2. 快慢双指针法。如下图所示,快指针以慢指针两倍的速度前进,当他们第一次相遇时,慢指针走了X+Y,快指针走了2*(X+Y),其中AB为X,BC为Y,那CB顺指针的距离就是2*(X+Y)-X-2*Y=X,此时将快指针放到头节点A处,让它们以相同速度前进,到B时正好相遇,也就是入口结点。

测试代码:

解法一:哈希Set



class Solution {
public:
    Listnode* EntryNodeOfLoop(ListNode* pHead) {
        unordered_set<ListNode*> S;
        while(pHead)
        {
            if(S.find(pHead)= = S.end())
            {
                S.insert(pHead);
                pHead = pHead->next;
            }
            else{
                return pHead;
            }
        }
        return nullptr;
    }
};

解法二:快慢双指针 



class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        // 空指针返回
        if(pHead == nullptr) 
            return nullptr;
        
        // 定义双指针
        ListNode* slow = pHead;
        ListNode* fast = pHead;
        
        // 当能形成闭路时,while才会无限循环直到break
        while(fast != nullptr && fast->next != nullptr)
        {
            // 快指针以两倍速度前进
            fast = fast->next->next;
            slow = slow->next;
            if(slow == fast)
                break;
        }
        
        // 若指向空指针,说明没有形成闭路
        if(fast == nullptr || fast->next == nullptr)
            return nullptr;
        
        // 将快指针指向头
        fast = pHead;
        
        // 当他俩相遇时,就是环形链表入口处
        while(fast != slow)
        {
            fast = fast->next;
            slow = slow->next;
        }
        
        return fast;
    }
};

到此这篇关于如何通过c++求出链表中环的入口结点的文章就介绍到这了,更多相关C++ 链表中环的入口结点内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 如何通过C++求出链表中环的入口结点

本文链接: https://lsjlt.com/news/159583.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何通过C++求出链表中环的入口结点
    目录题目描述:输入描述:返回值描述:示例:解题思路:测试代码:题目描述: 给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。 数据范围: n≤1000...
    99+
    2024-04-02
  • java如何确定一个链表有环及入口节点
    如何确定一个链表有环,入口节点是什么? 1.首先定义一个单链表; var ,next,是单链表中的属性,分别表示节点值和下一个节点的指向; 代码如下: //定义一个链表 cl...
    99+
    2024-04-02
  • C++解决输出链表中倒数k个结点的问题
    目录题目描述示例解题思路测试代码补充题目描述 输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。 如果该链表长度小于k,请返回一个长度为 0 的链...
    99+
    2024-04-02
  • 如何利用Java输出链表中倒数第k个结点
    目录前言问题描述方法一方法描述动画演示代码如下方法二 方法描述动画演示代码如下总结前言 链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组...
    99+
    2024-04-02
  • C语言中如何实现单链表删除指定结点
    目录单链表删除指定结点链表的删除结点(各种方法)链表中删除第i个结点删除与链表中与a相同的结点删除链表中重复元素单链表删除指定结点 在单链表中删除指定的结点。这里单链表是用尾插法建立...
    99+
    2024-04-02
  • 如何理解C语言数据结构中线性表的链式存储结构
    如何理解C语言数据结构中线性表的链式存储结构,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.什么是线性表的链式存储结构 —链表存储结点:包括元素本身的信息,还有元素之间的关系...
    99+
    2023-06-21
  • 如何通过ECharts和php接口实现统计图的数据导入和导出
    如何通过 ECharts 和 PHP 接口实现统计图的数据导入和导出在现代数据可视化中,统计图表是一种非常重要的方式,能够直观地展示数据的趋势和关系。而 ECharts 是一款非常强大的前端数据可视化库,能够提供丰富的图表类型和交互功能。本...
    99+
    2023-12-17
    PHP echarts 数据导入 数据导出
  • C++ 函数中的 lambda 表达式如何通过参数传递捕获外部变量?
    c++++ lambda 表达式可以通过参数传递来捕获外部变量,具体步骤如下:定义一个接受 lambda 表达式作为参数的函数。在 lambda 表达式中捕获外部变量。将 lambda ...
    99+
    2024-04-25
    lambda 捕获外部变量 c++
  • 如何在MySQL中设计仓库管理系统的表结构来管理库存入库和出库?
    如何在MySQL中设计仓库管理系统的表结构来管理库存入库和出库?随着电子商务的迅猛发展,仓库管理系统成为了许多企业不可或缺的一部分。在仓库管理系统中,库存的入库和出库是两个非常重要的环节。因此,设计一个合适的表结构来管理库存的入库和出库就显...
    99+
    2023-10-31
    库存管理 表结构 仓库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作