zoukankan      html  css  js  c++  java
  • 链表中环形的入口

    【题目描述】

    一个链表中包含环,请找出该链表的环的入口结点。
     
    【解题思路】
        有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。
      那么问题来了,如何判断一个链表是不是这类链表?如果链表为存在环,如果找到环的入口点?    当fast若与slow相遇时,slow肯定没有走遍历完链表(不是一整个环,有开头部分,如上图)或者恰好遍历一圈(未做验证,看我的表格例子,在1处相遇)。于是我们从链表头、相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点(慢指针走了n步,第一次相遇在c点,对慢指针来说n=s+p,也就是说如果慢指针从c点再走n步,又会到c点,那么顺时针的CB距离是n-p=s,但是我们不知道s是几,那么当快指针此时在A点一步一步走,当快慢指针相遇时,相遇点恰好是圆环七点B(AB=CB=s))。
    【代码实现】
     1 /*
     2 struct ListNode {
     3     int val;
     4     struct ListNode *next;
     5     ListNode(int x) :
     6         val(x), next(NULL) {
     7     }
     8 };
     9 */
    10 class Solution {
    11 public:
    12     ListNode* EntryNodeOfLoop(ListNode* pHead)
    13     {
    14         if(pHead==NULL)
    15             return NULL;
    16         ListNode* pAhead=pHead;
    17         ListNode* pBehind=pHead;
    18         while(pAhead!=NULL&&pAhead->next!=NULL)
    19         {
    20             pAhead=pAhead->next->next;
    21             pBehind=pBehind->next;
    22             if(pAhead==pBehind)
    23                 break;
    24         }
    25 
    26         if(pAhead==NULL||pAhead->next==NULL)
    27             return NULL;
    28 
    29         pAhead=pHead;
    30         while(pAhead!=pBehind)
    31         {
    32             pAhead=pAhead->next;
    33             pBehind=pBehind->next;
    34         }
    35         return pBehind;//return pAhead;
    36     }
    37 };
  • 相关阅读:
    php的cURL库介绍
    php函数ob_start()、ob_end_clean()、ob_get_contents()
    php中curl、fsockopen的应用
    App架构设计经验谈:服务端接口的设计
    图解正向代理与反向代理
    三种数据库连接池的配置
    数据库连接池在Tomcat中的几种配置方法
    Java四种线程池的使用
    JVM调优总结(一)-- 一些概念
    JVM调优总结(十)-调优方法
  • 原文地址:https://www.cnblogs.com/lou424/p/5029225.html
Copyright © 2011-2022 走看看