http://blog.csdn.net/learniting/article/details/7314475 中《单链表的环的入口点一个小证明》
如何判断一个单向链表是否有环?如果有,如何找到其入口节点的指针?
算法思想:用两个指针p1,p2同时指向链表的头部,p1一次移动一步,p2一次移动两步,如果最终p1和p2重合则说明链表有环,如果p2走到空指针(链表的结尾)则说明链表无环; 如果最终p1和p2重合,使p2重新指向链表的头结点,然后p1和p2同时一次移动一步,当p1和p2再次重合时该节点指针就是环的入口节点指针
可能有人问为什么会第二次会相遇呢
首先如果单链表有环的话,必在尾端出现
设单链表非环的部分为x个节点,环的部分为y个节点
那么第一次当p1走入环的入口点即走了x步时,p2已经走了2x个节点,也就是在环的内部走了x个节点( ny<x<(n+1)y),那么p2所在的位置是 环的第(x-ny)个节点的位置,然后那么距环的入口的距离是y-(x-ny), 而此时p1在环的入口处,那么p2要追上p1这需要走y-(x-ny)步
而此时p1重新走,p2步伐也变为1 那么当p1走入入口时 p2也走了x步了 所以p2总共走了 2(x+y-(x-ny))+x=2(n+1)y+x个节点 我们可以想啊,p2是不是走了x步后然后在环中转了2(n+1)圈 所以p2此时是在环的入口点俄,同时p1也刚好走到环的入口点,所以说此时它们刚好在环的入口点相遇
也可以用hash,参考:
http://hawstein.com/posts/2.5.html
相关推荐
单链表是一种基础的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在链表中,如果存在一个环,即某个节点的指针指向了链表中的先前节点,那么我们就称这个链表为带环链表。这类问题在计算机...
单链表解决约瑟夫环问题
该方法的核心思想是利用两个速度不同的指针(通常一个快指针每次移动两个节点,一个慢指针每次移动一个节点)来判断链表中是否存在环。 - **慢指针**(`p1`):每次向前移动一步。 - **快指针**(`p2`):每次向前...
约瑟夫环问题是一个经典的计算机科学问题,它涉及到链表数据结构和循环逻辑。在这个问题中,我们使用C语言和单链表来实现。以下是对该问题的详细解释: 首先,我们需要理解问题的背景和规则。约瑟夫环问题描述了一...
在这个“数据结构单链表实例一个简单的小程序”中,我们可以推测作者实现了一个用C语言编写的单链表操作程序,可能包括创建、插入、删除和遍历等基本操作。 单链表的特点在于它的每个节点只有一个指向后继节点的...
【约瑟夫环的单链表实现】 约瑟夫环问题,又称约瑟夫环序列,是...总的来说,约瑟夫环问题的单链表实现是一个锻炼数据结构基础和算法思维的好题目,有助于提升程序员对链表操作、循环逻辑以及复杂问题解决能力的理解。
建立一个单链表,在单链表上实现插入、删除和查找等操作,有菜单。 ⑴初始化字符型单链表H; ⑵采用尾插法建立单链表H,如(a,b,c,d,c); ⑶输出单链表H的长度; ⑷输出单链表H的第i个元素,如输出单链表H的第3...
在IT领域,尤其是在数据结构与算法的学习和面试中,判断单链表中是否存在环是一个非常典型且重要的问题。这个问题不仅考验了对链表这一数据结构的理解,还涉及到算法设计、循环检测等关键概念。 ### 题目背景 在...
首先,我们需要定义一个单链表的节点类Node,具有数据成员data和成员函数NextNode、InsertAfter、DeleteAfter,用于获取下一个结点、插入结点和删除结点。 接下来,我们需要定义一个单链表类LinkedList,具有数据...
在带头结点的单链表h中第i个数据元素之前插入一个数据元素x ,首先需要在单链表中寻找到第i-1个结点并用指针p指示,然后申请一个由指针s 指示的结点空间,并置x为其数据域值,最后修改第i-1个结点,并使x结点的指针...
创建单链表首先需要定义一个节点类,包含数据和指向下一个节点的指针。在编程中,这可能表现为: ```python class Node: def __init__(self, data): self.data = data self.next = None ``` 接下来,我们...
利用单向循环表存储结构模拟约瑟夫环过程,按照出列顺序打印个人编号
单链表的合并是指将两个或多个单链表合并成一个单链表,而保持原来的顺序。单链表的逆序是指将单链表的 顺序反转。 单链表的合并(非递归) 单链表的合并可以使用非递归方式实现,利用一个辅助指针来存储当前节点...
本项目"用C++实现一个单链表"旨在帮助开发者掌握如何在C++环境中创建、操作和管理单链表。以下是关于这个主题的详细说明。 首先,单链表是一种线性数据结构,其中每个元素称为节点,每个节点包含两部分:数据域和...
有一个线性表(a1,a2,...,an),它存储在有附加表头结点的单链表中,写一个算法,求出该线性表中值为x的元素的序号。如果x
根据给定的文件信息,我们将深入探讨如何将一个单链表转换为三个单循环链表,这涉及到数据结构中的链表操作以及字符分类处理。在理解这个过程之前,我们需要先了解链表的基本概念以及C语言中如何实现链表。 ### ...
单链表是数据结构中的基础概念,它是一种线性数据结构,由一系列节点构成,每个节点包含数据元素和指向下一个节点的引用。本篇文章将深入探讨单链表的原理、操作以及实例应用。 首先,单链表的结构简单明了。每个...
单链表是数据结构中的基础元素,它是一种线性数据结构,由一系列节点(也称为元素)组成,每个节点包含数据以及指向下一个节点的指针。在C++中,我们可以用结构体或类来表示链表节点。本主题将深入探讨如何在C++中...