数据结构--链表--单链表中环的检测,环的入口,环的长度的计算

就如数字6一样的单链表结构,如何检测是否有6下部的○呢,并且求交叉点位置
在这里插入图片描述

思路

  1. 使用快慢指针(一个一次走2步,一个走1步),若快慢指针第一次相遇,则有环
    慢指针路程 s=a+bs = a+bs=a+b
    快指针路程 2s=a+b+n∗R2s = a+b+n*R2s=a+b+nR
    s=n∗Rs = n*Rs=nR
    链表的长度 L=a+b+c=n∗R+cL = a+b+c = n*R+cL=a+b+c=nR+c
    L=a+RL = a + RL=a+R
    n∗R+c=a+R⇒(n−1)∗R+c=an*R+c = a+R \Rightarrow (n-1)*R+c = anR+c=a+R(n1)R+c=a
    意味着从head开始走到入口 aaa 步 == 从第一次相遇点走 n−1n-1n1 圈 + 再走 ccc

  2. 由上可以使快慢指针第一次到达相遇点时,使慢指针回到head,快指针仍在相遇点,然后两人步伐一致,最后会在入口相见。

C++代码实现:

完整代码见:https://github.com/hitskyer/course/tree/master/dataAlgorithm/chenmingming/linkedList

类实现函数

bool SingleList::hasLoop()
{bool loop = false;ListNode fast = m_pHead, slow = m_pHead;ListNode posMeet = m_pHead, ringEntrance = m_pHead;//环的可能的入口应初始化成headif(m_pHead == NULL){loop = false;std::cout << "list has no loop!" << std::endl;}else{while(fast && fast->pNext){fast = fast->pNext->pNext;slow = slow->pNext;if(fast == slow){loop = true;posMeet = fast; //第一次相遇的地方break;}}slow = m_pHead; //接着让慢指针回到表头(这里是关键),继续一起同步前行,第二次相遇的地方为环的入口while(slow != fast){slow = slow->pNext;fast = fast->pNext;if(fast == slow)ringEntrance = fast;}size_t lenOf_headToEntrance = howManyNode(m_pHead,ringEntrance);size_t ringLen_1 = howManyNode(ringEntrance->pNext, ringEntrance);std::cout << "len of head to ring entrance is " << lenOf_headToEntrance << std::endl;std::cout << "entrance Node is " << ringEntrance->data << std::endl;std::cout << "len of ring is " << ringLen_1 + 1 << std::endl;std::cout << "len of List is " << lenOf_headToEntrance + ringLen_1 + 1 << std::endl;}return loop;
}size_t SingleList::howManyNode(ListNode ps, ListNode pe)	//计算两个指针之间有多少个节点(不包含第二个参数处的节点)
{size_t count = 0;while(ps != pe){ps = ps->pNext;++count;}return count;
}

singleListIsLoop.cpp主函数

//
// Created by mingm on 2019/3/24.
//检查单链表中是否存在环,求环的长度,链表长度,及环的入口
#include <iostream>
#include <time.h>
#include <cstdlib>
#include "./homework/singleList.cpp"
using namespace std;
int main()
{srand((unsigned)time(NULL));    //用时间随机数种子size_t len = 10;       //测试链表最大长度for(size_t j = 1; j < len; ++j){SingleList intList;for(size_t i = 0; i < j; ++i){intList.AddTail(rand()%100);    //添加随机数到链表}cout << "no loop list: " << endl;intList.PrintList();    //排序前链表打印size_t n = rand()%(intList.GetLength());    //0-链表减1的随机数ListNode randNode = intList.GetHeadNode();for(size_t i = 0; i != n; ++i){randNode = randNode->pNext;     //链表的一个随机节点}ListNode originTail = intList.GetTailNode();originTail->pNext = randNode;    //尾节点接入链表中的随机位置形成环intList.hasLoop();  //调用环检测函数originTail->pNext = NULL;   //断开环,让链表能够按照单链表析构函数析构!!!!!!!std::cout << "getListLength() is " << intList.GetLength() << std::endl;std::cout << "-----------------------------------------" << std::endl;}return 0;
}

Valgrind检测结果

在这里插入图片描述
从链表长度1开始测试到9,测试结果均正确!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ACL 2010-2020研究趋势总结

一只小狐狸带你解锁 炼丹术&NLP 秘籍作者&#xff1a;哈工大SCIR 车万翔教授导读2020年5月23日&#xff0c;有幸受邀在中国中文信息学会青年工作委员会主办的AIS&#xff08;ACL-IJCAI-SIGIR&#xff09;2020顶会论文预讲会上介绍了ACL会议近年来的研究趋势&#xff0c;特整…

架构师进阶之独孤九剑:设计模式详解

我们继续架构师进阶之独孤九剑进阶&#xff0c;目前我们仍然在第一阶段&#xff1a;程序设计和开发环节。 “ 设计模式不仅仅只是一种规范&#xff0c;更多的是一种设计思路和经验总结&#xff0c;目的只有一个&#xff1a;提高你高质量编码的能力。以下主要分为三个环节&…

知识表示发展史:从一阶谓词逻辑到知识图谱再到事理图谱

研究证实&#xff0c;人类从一出生即开始累积庞大且复杂的数据库&#xff0c;包括各种文字、数字、符码、味道、食物、线条、颜色、公式、声音等&#xff0c;大脑惊人的储存能力使我们累积了海量的资料&#xff0c;这些资料构成了人类的认知知识基础。实验表明&#xff0c;将数…

领域应用 | 基于知识图谱的警用安保机器人大数据分析技术研究

本文转载自公众号&#xff1a;警察技术杂志。 郝久月 樊志英 汪宁 王欣 摘 要&#xff1a;构建大数据支撑下的智能应用是公安信息化发展的趋势&#xff0c;警用安保机器人大数据分析平台的核心功能包括机器人智能人机交互和前…

数据挖掘学习指南!!

入门数据挖掘&#xff0c;必须理论结合实践。本文梳理了数据挖掘知识体系&#xff0c;帮助大家了解和提升在实际场景中的数据分析、特征工程、建模调参和模型融合等技能。完整项目实践&#xff08;共100多页&#xff09;后台回复 数据挖掘电子版 获取数据分析探索性数据分析&am…

数据结构--栈--顺序栈/链式栈(附: 字符括号合法配对检测)

栈结构&#xff1a;先进后出&#xff0c;后进先出&#xff0c;像叠盘子一样&#xff0c;先叠的后用。 代码github地址 https://github.com/hitskyer/course/tree/master/dataAlgorithm/chenmingming/stack 1.顺序栈&#xff08;数组存储&#xff0c;需给定数组大小&#xff0c…

银行计考试-计算机考点2-计算机系统组成与基本工作原理

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/sinat_33363493/article/details/53647129 </div><link rel"stylesheet" href"https://csdnimg.cn/release/pho…

我们的实践: 400万全行业动态事理图谱Demo

历史经验知识在未来预测的应用 华尔街的独角兽Kensho&#xff0c;是智能金融Fintech的一个不得不提的成功案例&#xff0c;这个由高盛领投的6280万美元投资&#xff0c;总融资高达7280万美元的公司自推出后便名声大噪。Warren是kensho是一个代表产品&#xff0c;用户能够以通俗…

蚂蚁花呗团队面试题:LinkedHashMap+SpringCloud+线程锁+分布式

一面 自我介绍 map怎么实现hashcode和equals,为什么重写equals必须重写hashcode 使用过concurrent包下的哪些类&#xff0c;使用场景等等。 concurrentHashMap怎么实现&#xff1f;concurrenthashmap在1.8和1.7里面有什么区别 CountDownLatch、LinkedHashMap、AQS实现原理 …

肖仰华 | SIGIR 2018、WWW2018 知识图谱研究综述

本文转载自公众号&#xff1a;知识工场。全国知识图谱与语义计算大会&#xff08;CCKS: China Conference on Knowledge Graph and Semantic Computing&#xff09;由中国中文信息学会语言与知识计算专委会定期举办的全国年度学术会议。CCKS源于国内两个主要的相关会议&#xf…

数据结构--栈--共享顺序栈

共享顺序栈&#xff1a;内部也是一个数组 将两个栈放在数组的两端&#xff0c;一个从数组首端开始压栈&#xff0c;一个从数组尾部开始压栈&#xff0c;等到两边栈顶在中间相遇时&#xff0c;栈满。 共享顺序栈在某些情况下可以节省空间。 头文件 sharingStack.h //共享顺序…

一个励志PM小哥哥的Java转型之路

先给大家看张我朋友圈截图&#xff1a; 这哥们本科学英语的&#xff0c;毕业后做了产品经理&#xff0c;去年 9 月份开始学 Java&#xff0c;6 个月的时间&#xff0c;拿到了快手的 Offer。如果你对 Java 也有兴趣&#xff0c;不妨听完这个故事。你是不是也和他当时的处境…

最全蚂蚁金服高级Java面试题目(3面)

一面&#xff1a; JVM数据存储模型&#xff0c;新生代、年老代的构造&#xff1f; java GC算法&#xff0c;什么时候会触发minor gc&#xff0c;什么时候会触发full gc&#xff1f; GC 可达性分析中哪些算是GC ROOT&#xff1f; 你熟悉的JVM调优参数&#xff0c;使用过哪些调…

运用事理图谱搞事情:新闻预警、事件监测、文本可视化、出行规划与历时事件流生成

目前&#xff0c;事理图谱在描述领域事件时空信息上具有独特性&#xff0c;这种逻辑图结构能够以一种直观的方式向我们展现出一个领域知识的链路信息。从学术的角度上来说&#xff0c;事理图谱与事件抽取、事件关系抽取、脚本学习、事件链生成、篇章句间关系识别、图谱图结构运…

CCKS 2018 | 最佳论文:南京大学提出 DSKG,将多层 RNN 用于知识图谱补全

本文转载自公众号&#xff1a;机器之心。 选自CCKS 2018作者&#xff1a;Lingbing Guo、Qingheng Zhang、Weiyi Ge、Wei Hu、Yuzhong Qu机器之心编译参与&#xff1a;Panda、刘晓坤2018 年 8 月 14-17 日&#xff0c;主题为「知识计算与语言理解」的 2018 全国知识图谱…

计算机软件系统

计算机软件系统按其功能可分为系统软件和应用软件两大类。1、系统软件系统软件是指管理、控制、和维护计算机及其外部设备&#xff0c;提供用户与计算机之间操作界面等方面的软件&#xff0c;它并不专门针对具体的应用问题。代表性的系统软件有&#xff1a;操作系统、数据库管理…

数据结构--栈--浏览器前进后退应用

浏览器前进后退&#xff1a; 当你依次浏览a&#xff0c;b&#xff0c;c,然后回到b&#xff0c;再浏览d&#xff0c;就只能查看a&#xff0c;b&#xff0c;d&#xff0c;了。 原理&#xff1a; 利用两个栈A,B 浏览新网页的时候&#xff0c;压入栈A&#xff0c;清空栈B前进&…

关于BERT,面试官们都怎么问

1.BERT 的基本原理是什么&#xff1f;BERT 来自 Google 的论文Pre-training of Deep Bidirectional Transformers for Language Understanding&#xff0c;BERT 是“Bidirectional Encoder Representations from Transformers”的首字母缩写&#xff0c;整体是一个自编码语言模…

牛逼!支付宝高级Java三面题目:线程锁+事务+雪崩+Docker等

支付宝高级Java一面 JVM中的老年代在什么情况下会触发GC&#xff1f; CMS的垃圾回收步骤&#xff0c;G1和CMS的区别&#xff1f; CMS哪个阶段是并发的&#xff0c;哪个阶段是串行的&#xff1f; 谈谈Java线程池&#xff0c;线程池中几个参数含义 谈谈你了解的J.U.C包的JDK源…

鲍捷 | 深度解析知识图谱发展关键阶段及技术脉络

本文转载自公众号&#xff1a; AI科技大本营 。 分享嘉宾 | 鲍捷&#xff08;文因互联CEO&#xff09;出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;知识图谱是人工智能三大分支之一——符号主义——在新时期主要的落地技术方式。该技术虽然在 20…