单链表带环问题

判断单链表是否带环?若带环,求环的长度?求环的入口点?并计算每个算法的时间复杂度&空间复杂度
分析:不带环fast指针可以走到尾,带环则走不到;若带环fast指针一次走两步,slow指针一次走一步。(fast和slow的间距会逐渐缩小,一次缩小1,不会错过,其余走法可能会跳过,或者构成死循环);入口点:第二次的相遇点

ListNode* IsHaveLoop(ListNode* plist)//判断是否带环  
{  
   if(plist == NULL)  
   {  
       retuern NULL;  
    }  
    ListNode* fast = plist;  
    ListNode* slow = plist;  
    while(fast->next && fast)  
    {  
        fast = fast->next->next;  
        slow = slow->next;  
        if(fast == slow)  
        {  
             return slow;  
         }  
     }  
     return NULL;  
}  
[cpp] view plain copy
//利用快慢指针,遍历单链表,如果相遇即fast == slow,则证明存在环,返回相遇点。<pre class="cpp" name="code"></pre>  
<pre></pre>  
<div><br>  
</div>  
<pre class="cpp" name="code">int LengthOfLoop(ListNode* plist)//求环长    
{    
    ListNode* meet = IsHaveLoop(plist);    
    if (meet)    
    {    
        int count = 1;    
        ListNode* tmp = meet->next;    
        while (tmp != meet)    
        {    
            tmp = tmp->next;    
            count++;    
        }    
        return count;    
    }    
    return 0;    
}<pre class="cpp" name="code"></pre>  
<pre></pre>  
<div><pre class="cpp" name="code">ListNode* EnterNode(ListNode* plist) //求入口点    
{    
    ListNode* meet = IsHaveLoop(plist);    
    if(meet)    
    {    
        while (meet != plist)    
        {    
            meet = meet->next;    
            plist = plist->next;    
        }    
        return plist;    
    }    
    return NULL;    
}</pre><pre class="cpp" name="code"></pre><pre class="cpp" name="code"></pre><br>  
</div>  
<div><br>  
</div>  
<div><br>  
</div>  

</pre>  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章