判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?並計算每個算法的時間複雜度&空間複雜度
分析:不帶環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>