zoukankan      html  css  js  c++  java
  • 快慢指针二

    上次看到的题目仅是判断是否有环,如果要求出环的起点位置又该如何呢?

    这里看到关于快慢指针的证明,感觉有必要记下来下。

    假设链表头到环头距离k,环长度n,指针相遇位置距离环头为x,慢指针直到相遇时移动距离为m

    那么有m=k+x+pn,2m-m=qn;

    那么有qn=k+x+pn,即k+x=(q-p)n;

    可以发现从表头到相遇位置的距离是环长的整数倍。

    那么,将slow或者fast任意一个指针从相遇位置直接移动到表头。

    然后while(slow!=fast)slow++,fast++(这里fast也只一次一步)

    那么最后slow=fast时,一定是环头位置。

    node *  f(node* head)
    {
     node* slow =head,fast=head;
     while(slow!=head)//就不考虑环不存在的情况了
    {
      slow=slow->next;
       fast=fast->next->next; 
    }
      fast=head;
      while(fast!=slow)
      {
       slow=slow->next;
       fast=fast->next;
       }
     return fast;
    
    }

     不过这种方法比较tricky,学c++的应该想到这样的方法、

    map<node*,bool>看到这个容器自然就该知道接下来怎么写了

    node * f(node* head)
    {
       map<node*,bool> hash;
       while(!map[head])
       { 
         map[head]=true;
         head++;
        }
    return head;
    }
  • 相关阅读:
    整数子数组求最大和
    四则运算实现
    四则运算
    2015年大二下学期读书计划
    java变量和数据类型
    jdk的安装和java的入门概念
    数据库的设计
    多表查询
    数据约束和外键
    表数据的简单查询语句
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3621502.html
Copyright © 2011-2022 走看看