單鏈錶帶環問題

判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?並計算每個算法的時間複雜度&空間複雜度
分析:不帶環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>  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章