单链表带环问题
来源:互联网 发布:开机显示便签损坏 知乎 编辑:程序博客网 时间: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>
阅读全文
0 1
- 单链表带环问题
- 单链表带环问题
- 单链表带环问题
- 有关单链表带环的问题
- 面试题----单链表带环问题
- 链表带环问题
- 链表带环问题1
- 关于单链表带环的一系列问题
- 单链表带环的一系列问题
- c/c++单链表面试题—链表带环问题
- 链表带环问题【每日一题】
- 链表带环和相交的问题
- 【每日一题-3】链表带环问题
- 链表带环的问题研究及代码实现
- 单链表带头结点&不带头结点
- 单链表带头结点&不带头结点
- 单链表带头结点&不带头结点
- 链表面试题3/链表带环问题--判断链表是否带环?
- mysql数据库及表编码格式大纲
- 关于web的一些总结
- arm 学习笔记2
- 算法初探-动态规划(Dynamic Programming)
- 分段管理机制(段描述符,描述符表,段选择符)
- 单链表带环问题
- P4230方块消除
- C语言入门第三篇,变量
- SQLScout插件破解版
- spring容器的懒加载lazy-init设置
- 变异分析
- 实现决策数(ID3)算法
- 如何安全的上网
- GCC -M,-MM,-MMD,-MF,-MT