美文网首页iOS开发
单链表判断环路及环路的入口

单链表判断环路及环路的入口

作者: Pandakingli | 来源:发表于2017-11-27 16:09 被阅读115次

1. 遍历链表

将已经遍历过的节点放在一个hash表中,如果一个节点已经存在hash表中,说明有环。
时间复杂度:O(n)
空间复杂度:O(n)

2. 快慢指针

时间复杂度:O(n)
空间复杂度:O(1)
使用两个指针

判断环的存在:

设置两个指针fast和slow,初始值都指向头,slow每次前进1步,fast每次前进2步。
链表存在环:则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则是无环链表)。
链表不存在环:fast先行头到尾部为NULL,则是无环链表。

寻找环的入口点:

当fast按照每次2步,slow每次1步的方式走,发现fast和slow重合,确定了单向链表有环路。
接下来,让fast回到链表的头部,重新走,每次步长1,那么当fast和slow再次相遇的时候,就是环路的入口了。

证明:在fast和slow第一次相遇的时候,假定slow走了n步,环路的入口是在p步,那么
slow走的路径: p+c = n; c为fast和slow相交点 距离环路入口的距离
fast走的路径: p+c+kL = 2n; L为环路的周长,k是整数
显然,如果从p+c点开始,slow再走n步的话,还可以回到p+c这个点。
同时,fast从头开始走,步长为1,经过n步,也会达到p+c这点。
显然,在这个过程中fast和slow只有前p步骤走的路径不同。所以当p1和p2再次重合的时候,必然是在链表的环路入口点上。

typedef int DataType;//节点中数据类型

typedef struct ListNode//节点数据结构
{
    DataType data;
    struct ListNode *next;
} ListNode;

ListNode *IsCycle(ListNode *plist)//判断是否带环
{
    ListNode *fast = plist;
    ListNode *slow = plist;

    while ((fast != NULL) && (fast->next != NULL))
    {
        fast = fast->next->next;
        slow = slow->next;
        if (fast == slow)
            return fast;
    }
    return NULL;
}

//求环的长度
int GetCycleLen(ListNode *meetnode)
{
    ListNode *cur = NULL;
    int count = 1;

    cur = meetnode->next;
    while (cur != meetnode)
    {
        cur = cur->next;
        count++;
    }
    return count;
}
//求环的入口点
ListNode *GetCycleEnter(ListNode *plist, ListNode *meetnode)
{

    while (plist != meetnode)
    {
        plist = plist->next;
        meetnode = meetnode->next;
    }
    return plist;
}

参考文章
参考

相关文章

  • 单链表判断环路及环路的入口

    1. 遍历链表 将已经遍历过的节点放在一个hash表中,如果一个节点已经存在hash表中,说明有环。时间复杂度:O...

  • 经典面试题之链表

    《程序员面试金典》p49,2.6, 求单链表环路的入口结点。 相关题目:给定两个单链表,求他们的共同交点。解法:(...

  • [leetcode Linked List Cycle II]

    附上原题: 给定一个链表,如果该链表存在环路,要求返回环路的开始节点,否则返回NULL。第一个版本只要求判断链表是...

  • 5个链表的常见操作

    链表 链表反转 LeetCode206:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 环路检...

  • 我与我的小区(三)

    上一章 我的小区四周的街道叫做环路,东环路、西环路、南环路、北环路。 东环路是我的小区和春小区...

  • 检测链表有环

    题目:如何判断一个单链表是否有环?若有环,如何找出环的入口节点。 一、单链表是否有环 思路分析: 单链表有环,是指...

  • 链表

    1判断一个单链表是否有环 2判断一个单链表中环的入口 3在链表的第k个位置插入一个结点 4找到链表中的倒数第k个位...

  • Java常用类库与技巧-集合

    一 数据结构常见问题 数组和链表的区别;链表的操作,如反转,链表环路检测,双向链表,循环链表相关操作;队列,栈的应...

  • 第 34 策 环环相扣

    反馈环路(Feedback Loop) 反馈环路=正反馈环路+负反馈环路第一个特点:3 个分子的反馈环是最经典的一...

  • 死亡环路

    “我倒数了哦!10、9、8……” 阿明趴在墙上开始倒数,陈群和他的小伙伴们“唔啦”一声都跑开了。 这里是陈群的家,...

网友评论

    本文标题:单链表判断环路及环路的入口

    本文链接:https://www.haomeiwen.com/subject/kuflbxtx.html