判断单链表是否带环?若带环,求环的长度?求环的入口点?并计算每个算法的时间复杂度&空间复杂度
分析:不带环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>