单链表带环问题

来源:互联网 发布:开机显示便签损坏 知乎 编辑:程序博客网 时间:2024/04/28 06:33

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