带环单链表及链表相交问题的分析及代码实现

2023-11-16

什么样的是带环单链表?什么样的是不带环单链表?

带环单链表就是单链表的尾结点有连接到单链表自身的某一个结点构成了环



  首先,我们怎样检测一个单链表是否带环?

1.检测单链表是否带环

    如果链表不带环,可以通过遍历链表找到尾节点;那如果单链表带环,就找不到链表得到尾部了,如果遍历一个带环链表,程序就会陷入死循环。

    那怎么办呢?

     可以利用快慢指针的思想。定义两个指针都指向链表的头指针,然后遍历链表,让一个指针每次走两个节点,让另一个指针每次走一个节点,这样两个指针在入环前的一段距离是不可能追上的,且入环后快指针和慢指针一定会相遇,则可得若两个指针若在遍历一段后相遇,则带环;若直到走到尾结点,慢指针还没有追上快指针,那么一定是不带环。

//检测链表是否带环
pNode CheckCycle(pList plist)   //参数是:链表的头指针 
{
	pNode fast = plist;
	pNode slow = plist;
    
	while (fast != NULL&&fast->next != NULL)   //若条件成立,则快指针走到尾结点了,说明是无环
	{
		fast = fast->next->next;    
		slow = slow->next;
		if (fast == slow)         //若条件成立,快慢指针则在环上相遇,说明有环
		{
			return slow;
		}
	}
	return NULL;
}

2.若有环求环的长度

  通过上面函数可以检测是否带环,如果带环,则返回的是一个相遇点的结点,可以通过这个结点来解这道题

  因为已经带环,则从这个相遇点出发,当再次回到这个结点时,便刚好在环上走了一圈,则可计算出环的结点数

//若有环, 求环的长度
int GetCircleLength(pList plist)    //参数是:检查是否带环的函数里的快慢指针的相遇点 即int GetCircleLength(CheckCycle(plist));
{
	pNode cur = plist;
	int count = 0;
	while(1)
	{
		cur = cur->next;
		count++;
		if (cur == plist)         //这里遍历链表,从相遇点出发,再回到相遇点便是一圈
		{
			return count;
		}
	}
}


3.若有环,找出环的入口点

   求环的入口点需要上面两个函数的帮助,要借助相遇点meetNode环的节点数K来进行一些推理,看下图

     

看代码:

pNode GetNode(pList plist, pNode meetNode)    //pilst:链表头指针   meetNode快慢指针在环上的相遇点
{
	pNode cur = plist;
	while (cur != meetNode)    //在入口点相遇时,条件成立
	{
		cur = cur->next;
		meetNode = meetNode->next;
	}
	return cur;
}


下面我们看几中链表相交的情况:


   


怎么判断两条不带环的链表是否相交呢?

 很简单,可以遍历两个链表,找到尾结点,看两个链表的尾结点是否相等,若相等则相交;反之,不相交

代码如下:

int CheckCross(pList list1, pList list2)
{
	if (list1 == NULL || list2 == NULL)
	{
		return 0;
	}
	while (list1->next != NULL)
	{
		list1 = list1->next;
	}
	while (list2->next != NULL)
	{
		list2 = list2->next;
	}
	if (list1 == list2)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

还没有完!!!!想一想若相交,怎样找到相交点?


我们已经知道带环单链表环的入口结点怎么找,那就应该知道怎么找两个链表的相交点

可以把两条相交链表的尾部结点连接到某一个链表的头部,这样就构成了一个带环的单恋表;

如下图,这时两条链表的交点就变成了带环的单链表环的入口点,便可用上面的方法求得

  

这里的代码就不贴了,都是可以根据上面的代码完成,有兴趣可以动手敲一下








判断连个带环链表相交分三种情况:不向交,相交且入口点相同,相交但入口点不同

怎么判断两条带环链表是否相交?

首先,可以通过上面的方法找到每个链表环的入口结点,判断一个链表上环的入口结点是否在另一个链表上,若在则链表相交;反之不相交


如果相交,又分为上图2和3两种情况,那怎么区分呢?

2: 相交且入口点相同                   3:相交但入口点不同

判断的方法也很简单,我们判断链表是否带环时得到了一个相遇结点,这个结点在环上,可以从这个结点出发,把环遍历一遍,判断结点是否与两个链表的入口结点相等,若两个入口结点都在环上则是情况3;反之情况2


代码也是根据上面的一些函数可以完成





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带环单链表及链表相交问题的分析及代码实现 的相关文章

  • AD之PCB中元器件旋转45度后两元器件无法靠得很近

    最近笔者因为在画一块圆形PCB板 所以为了节省PCB空间 有时需要将元器件倾斜放置 在这时就产生了一个问题 问题情况及解决办法记录如下 问题描述 首先是正常竖直放置时 两元器件可以放置得很近 这没有问题 然后将两元器件同时选中并旋转45度
  • 软件工程基础知识--需求分析

    软件需求 在进行需求获取之前 首先要明确需要获取什么 也就是需求包含哪些内容 软件需求是指用户对目标软件系统在功能 行为 性能 设计约束等方面的期望 通常 这些需求包括功能需求 性能需求 用户或人的因素 环境需求 界面需求 文档需求 数据需
  • Numpy 数组切片

    一 列表切片 一维数组 1 1 切片原理 列表切片是从原始列表中提取列表的一部分的过程 在列表切片中 我们将根据所需内容 如 从何处开始 结束以及增量进行切片 剪切列表 Python中符合序列的有序序列都支持切片 slice 例如列表 字符

随机推荐

  • 嵌入式成长手册——初级嵌入式开发工程师技术栈

  • 【python爬虫】爬虫程序模板(面向对象)

    爬虫代码模板 程序结构 class xxxSpider object def init self 定义常用变量 比如url或计数变量等 def get html self 获取响应内容函数 使用随机User Agent def parse
  • 了解 HTTP3.0 吗?简要说一下 HTTP 的一个发展历程?

    码字不易 有帮助的同学希望能关注一下我的微信公众号 Code程序人生 感谢 代码自用自取 一 HTTP 3 0 HTTP3 0 也称作HTTP over QUIC HTTP3 0的核心是QUIC 读音quick 协议 由Google在 20
  • 埋点数据

    原文源自 http www woshipm com pmd 751876 html 本文作者将从一个埋点系统设计者的角度通俗系统地讲解埋点的全过程 涉及到埋点基础知识 埋点作用 埋点方法 埋点数据流程 埋点应用 埋点管理等信息 埋点是什么
  • STM32之中断与事件---中断与事件的区别

    转自http blog csdn net flydream0 article details 8208463
  • docker添加新的环境变量_关于docker:在Dockerfile中,如何更新PATH环境变量?

    我有一个从源代码下载和构建GTK的dockerfile 但以下行没有更新我的图像的环境变量 RUN PATH opt gtk bin PATH RUN export PATH 我读到我应该使用ENV来设置环境值 但以下指令似乎也不起作用 E
  • conda的安装与使用

    conda的安装与使用 一 conda可以干嘛 官方介绍 Anaconda 是一个包含数据科学常用包的 Python 发行版本 它基于 conda 一个包和环境管理器 衍生而来 你将使用 conda 创建环境 以便分隔使用不同 Python
  • 苏神文章解析(6篇)

    苏神文章解析 文章目录 苏神文章解析 1 浅谈Transformer的初始化 参数化与标准化 1 1采样分布 截尾正态分布 1 2 正交初始化 Xavier初始化 1 3 直接标准化 1 4 NTK参数化 1 5 残差连接 2 模型参数的初
  • 图像边缘算法——计算图像边缘(OpenCV)

    目录 一 算法描述 二 计算欧氏距离的Python代码 三 完整的代码 四 结果 一 算法描述 算法的基本原理是 将当前像素与邻接的下部和右部进行比较 如果相似 则将当前像素设置为白色 否则设置为黑色 如何判定像素相似呢 应用欧式距离算法
  • 吐血整理!Python程序员常见的几种变现方式!

    今天聊一个特俗但是大家都想的事情 那就是 赚钱 这件事 先说为什么这个事情 特俗 因为其实我发现我身边大部分程序员不爱谈钱 或者羞于谈钱 加上程序员工资普遍比较高 所以早期都没啥压力 但是随着年龄增大 薪资的涨薪幅度放缓 问题逐渐就暴露出来
  • n个人围成一圈 报数3 python

    n int input count 0 a list range 1 n 1 while len a gt 1 b a for i in range len a count 1 if count 3 0 a remove b i print
  • 不能使用clr编译c文件 怎么强制用clr_一名合格的 C/C++ 开发者拥有这些能力,你就可以去面试了!...

    首先你需要一个显得十分有 经验 的发型 然后拥有一身程序员的基本装备 比如 言归正传 在大多数开发人员的认知中 C C 是一门非常难学的编程语言 很多人知道它的强大 但因为 难 造成的恐惧让很多人放弃 在我看来 C C 一旦学成 其妙无穷
  • Hive简介和安装

    1 Hive是基于hadoop的数据仓库解决方案 由facebook贡献给Apache Hive出现的初衷是让不熟悉编程的数据分析人员也能够使用hadoop处理大数据 这是怎么实现的呢 2 我们先来看看Hive提供的接口 从下面Hive的架
  • Tesseract3.02训练生成新的识别语言库的详细步骤

    说明 本文参考了很多前辈的资料 主要是 tesseract OCR3 0语言库训练步骤 再结合自己的实践操作 个人感觉官网的教程是最权威的 耐着性子看完 收获很大 比网上到处看别人理解的更好 毕竟每个人理解的都是自己的 不全面 当然也包括本
  • Vue键盘事件

    一 keydown和keyup的区别 keydown 和 keyup 是JavaScript中用于捕获键盘按键事件的两个事件类型 它们有以下区别 触发时机 keydown 事件在按下键盘上的键时触发 无论是否已释放 keyup 事件在释放键
  • 深度学习之自编码器(2)Fashion MNIST图片重建实战

    深度学习之自编码器 2 Fashion MNIST图片重建实战 1 Fashion MNIST数据集 2 编码器 3 解码器 4 自编码器 5 网络训练 6 图片重建 完整代码 自编码器算法原理非常简单 实现方便 训练也较稳定 相对于PCA
  • 知识图谱基础代码构建(医疗向)

    今天上线发现自己竟然涨粉了 也给了我更大的动力将这一方面继续记录下去 这里是对另外一个项目代码的解读 个人认为是对前面连续几篇中文医疗知识图谱的解读的一个补充 有着拨云见日的作用 项目来源是GitHub上面刘老师做的一个基于知识医疗图谱的问
  • 【linux】——动静态库

    目录 动静态的比较 扩展名 编译操作 执行的状态 生成静态库 生成动态库 总结 在linux操作系统中 函数库是一个非常重要的的东西 因为很多软件之间都会互相使用彼此提供的函数来使用其特殊的功能 例如 我们在写c语言的时候 但我们要使用pr
  • 【人工智能】5.不确定性推理

    一 不确定推理预备知识 1 不确定性推理的含义 不确定性推理实际上是一种从不确定的初始证据出发 通过运用不确定性知识 最终推出具有一定程度的不确定性但却又是合理或基本合理的结论的思维过程 2 不确定推理基本问题 1 不确定性的表示 知识的不
  • 带环单链表及链表相交问题的分析及代码实现

    什么样的是带环单链表 什么样的是不带环单链表 带环单链表就是单链表的尾结点有连接到单链表自身的某一个结点构成了环 首先 我们怎样检测一个单链表是否带环 1 检测单链表是否带环 如果链表不带环 可以通过遍历链表找到尾节点 那如果单链表带环 就