`
iwebcode
  • 浏览: 2071697 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

判断单链表是否存在环

 
阅读更多

问题:

1、如何判断一个链表是不是这类链表?

2、如果链表为存在环,如果找到环的入口点?

解答:

一、判断链表是否存在环,办法为:

设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则为无环链表)程序如下:

bool IsExitsLoop(slist *head)

{

slist *slow = head, *fast = head;

while ( fast && fast->next )

{

slow = slow->next;

fast = fast->next->next;

if ( slow == fast )break;

}

return !(fast == NULL || fast->next == NULL);

}

二、找到环的入口点

当fast若与slow相遇时,slow肯定没有走遍历完链表,见注释(1)而fast已经在环内循环了n圈(1<=n)。假设slow走了s步,则fast走了2s步(fast步数还等于s 加上在环上多转的n圈),设环长为r,则:

2s = s + nr

s= nr

设整个链表长L,入口环与相遇点距离为x,起点到环入口点的距离为a。

a + x = nr

a + x = (n – 1)r +r = (n-1)r + L - a

a = (n-1)r + (L – a – x)

(L – a – x)为相遇点到环入口点的距离,由此可知,从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点,于是我们从链表头、与相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。程序描述如下:

slist* FindLoopPort(slist *head)

{

slist *slow = head, *fast = head;

while ( fast && fast->next )

{

slow = slow->next;

fast = fast->next->next;

if ( slow == fast )break;

}

if (fast == NULL || fast->next == NULL)

return NULL;

slow = head;

while (slow != fast)

{

slow = slow->next;

fast = fast->next;

}

return slow;

}

分享到:
评论

相关推荐

    判断单链表中是否存在环

    在IT领域,尤其是在数据结构与算法的学习和面试中,判断单链表中是否存在环是一个非常典型且重要的问题。这个问题不仅考验了对链表这一数据结构的理解,还涉及到算法设计、循环检测等关键概念。 ### 题目背景 在...

    快慢指针法判断单链表有环

    在Java中,判断单链表是否有环的经典方法是使用Floyd的“龟兔赛跑”算法,也称为快慢指针法。这种方法利用两个指针,一个每次走一步(称为慢指针),另一个每次走两步(称为快指针)。如果链表中存在环,那么快指针...

    单链表 环 入口点 环长

    本文将详细介绍如何判断单链表中是否存在环,以及如何找到环的入口点和环的长度。 首先,我们需要确定单链表是否存在环。这是通过快慢指针法来完成的,该方法也被称为龟兔赛跑算法。其基本思想是设置两个指针,一个...

    面试单链表问题总结-反转,逆序输出,判环,求交点

    第三,**判断单链表是否存在环**是数据结构中的一大难点。Floyd判环算法,也称为快慢指针法,是最常用的解决方案。设置两个指针,一个每次移动一步(慢指针),另一个每次移动两步(快指针)。如果链表存在环,快...

    Java实现单链表以及单链表的操作.zip

    11. **判断单链表是否存在环**: 使用Floyd判环法(也称为龟兔赛跑算法),让两个指针以不同速度移动,如果存在环,它们最终会相遇。 12. **环的长度**: 如果发现链表有环,可以使用快慢指针再次相遇后继续移动...

    双指针法判断链表有环-Java 版

    附件是使用双指针发判断链表有环的代码实现,在Java中,判断单链表是否有环的经典方法是使用Floyd的“龟兔赛跑”算法,也称为快慢指针法。这种方法利用两个指针,一个每次走一步(称为慢指针),另一个每次走两步...

    Python程序员面试分类模拟9.doc

    3. **判断单链表是否存在环** - 判断单链表是否包含环,可以使用快慢指针法,也称为Floyd判环算法。设置两个指针,一个快指针每次移动两个节点,一个慢指针每次移动一个节点。如果链表有环,快指针最终会追上慢指针...

    yuesefu.rar_创建一个循环链表_按指定位置删除_循环单链表_约瑟夫环

    本程序的目标是通过循环单链表实现约瑟夫环问题的解决方案,包括创建链表、按指定位置删除节点以及最后打印删除的编号序列。 首先,我们需要了解循环链表。循环链表与普通链表的主要区别在于,它的最后一个节点指针...

    快慢指针证明带环单链表

    该方法的核心思想是利用两个速度不同的指针(通常一个快指针每次移动两个节点,一个慢指针每次移动一个节点)来判断链表中是否存在环。 - **慢指针**(`p1`):每次向前移动一步。 - **快指针**(`p2`):每次向前...

    C语言链表在笔试常考题.docx

    判断单链表是否有环是指检测链表中是否存在环的操作。例如,链表1-&gt;2-&gt;3-&gt;4-&gt;5-&gt;3是一个有环的链表,因为链表中存在环。 解决方案: ```c bool IsExitsLoop(NodeList head){ NodeList slow=head,fast=head; ...

    java实现单链表中是否有环的方法详解

    这篇文章主要探讨的是如何判断一个单链表中是否存在环,这是一个重要的算法问题,特别是在数据结构和算法的学习中。 首先,我们需要了解问题的核心:检查链表中是否存在环。一个简单的算法是使用两个指针,我们称为...

    单链表的基本操作

    如果存在环,快慢指针最终会在环内相遇;若无环,快指针会先到达尾部。 以上都是单链表的基本操作。在实际编程中,链表结构广泛应用于各种数据处理任务,如缓存管理、图形渲染、队列和栈的实现等。理解和熟练掌握...

    单链表单链表单链表单链表

    7. 判断链表是否有环:检查链表中是否存在循环引用,即某个节点的指针回指到链表的早期节点。 在实际编程中,实现这些操作通常需要用到结构体或类来表示链表节点,如`struct ListNode { int val; ListNode *next; }...

    带环单链表查找环的入口算法(Java语言描述)

    如果链表中存在环,快指针最终会追上慢指针,相遇点即为环内的一个点。为了找到环的入口,我们需要进行如下步骤: - 初始化两个指针,慢指针和快指针都位于链表头部。 - 遍历链表,直到快指针追上慢指针(即两者...

    数据结构-单链表的操作

    如果两者相遇,说明存在环;若快指针到达尾部,说明无环。 **10. 复制链表** 复制链表意味着创建一个新的链表,其中包含原始链表的所有元素。这需要创建新节点并保持旧节点和新节点间的对应关系。 以上是对单链表...

    单链表综合应用.rar

    至于快慢指针的应用,它在单链表中主要用于判断链表是否为环形结构。快指针每次移动两个节点,慢指针每次移动一个节点。如果两个指针相遇,则链表存在环;否则,当快指针到达链表末尾时,链表无环: ```c bool ...

    单链表的各种基本运算的算法.zip

    9. **判断链表是否有环**:通过快慢指针(也称作Floyd判环法)可以检测链表中是否存在环。快指针每次移动两步,慢指针每次移动一步,如果它们相遇,说明链表有环;否则,当快指针到达链表末尾时,链表无环。 10. **...

    算法大全-面试题-数据结构.docx

    假设链表的长度为n,那么可以使用两个指针,一个指针从头节点开始移动,另一个指针从头节点移动两倍的速度,如果两个指针相遇,则链表中存在环。 9. 判断两个单链表是否相交 可以使用哈希表来解决这个问题。首先...

    关于有环链表的问题

    通过以上介绍,我们不仅了解了如何判断链表中是否存在环以及如何找到环的入口点,而且还学习了如何处理两个单链表的相交问题。这些知识点对于理解链表的基本操作非常关键,并且在算法设计中有着广泛的应用。

    单链表内容介绍.zip

    9. **判断链表是否有环**:检测链表中是否存在环是一个常见的问题,可以使用快慢指针(也称为龟兔赛跑算法)来解决。快指针每次移动两个节点,慢指针每次移动一个节点。如果链表有环,快指针最终会追上慢指针;反之...

Global site tag (gtag.js) - Google Analytics