linear list 链式存储方式经典问题 判定链表中有无cycle 以及 cycle entrance (附数学推导)

仅讨论单向链表中单个cycle的判定和cycle entrance的返回

本文内容

  1. 快慢指针解决环形链表判定和入口寻找
  2. 快慢指针成立原理方法推导

问题描述
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
说明:不允许修改给定的链表。
使用 O(1) 空间解决此题(即常数内存空间)

作者:力扣 (LeetCode)
题源链接:https://leetcode-cn.com/leetb...
来源:力扣(LeetCode)
题解作者:WildDuck

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) 
{
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    
    while(fast != NULL && slow != NULL && fast->next != NULL)
    {
        slow = slow -> next;
        fast = fast -> next -> next;
        
        if(slow == fast)
        {
            struct ListNode* entrance = head;
            while(entrance != slow)
            {
                entrance = entrance -> next;
                slow = slow -> next;
            }
            return entrance;
        }
        
    }
    return NULL;
}

image.png
------------------------------------------------------------------------------------------------------------
原理推导
linear list 链式存储方式经典问题 判定链表中有无cycle 以及 cycle entrance (附数学推导)_第1张图片
linear list 链式存储方式经典问题 判定链表中有无cycle 以及 cycle entrance (附数学推导)_第2张图片

你可能感兴趣的:(数据结构和算法)