zoukankan      html  css  js  c++  java
  • 如何判断单链表有环

     
    分三种情况
    1.尾节点指向null(链表无环)
    2.尾节点指向头结点
    2.尾结点指向非头结点
    思路
    设置两个指针,a跑的快,b跑的慢,如果链表有环,那么当程序执行到某一状态时,a==b。如果链表没有环,程序会执行到a==NULL,结束。
     1  listnode slow=head;// //链表第一个节点
     2  listnode fast=head.next; //链表第二个节点
     3 while(fast)//当跑的快的节点不为空,继续判断
     4 {
     5     if(fast==slow)//情况2,3
     6     {
     7        System.out.println("有环");
     8         return 0;
     9     }
    10     else
    11     {
    12         fast=fast.next;
    13         if(!fast)//情况1,最后一个节点的后继节点为null
    14         {
    15           System.out.println("无环");
    16             return 0;
    17         }
    18         else
    19         {
    20             fast=fast.next;
    21             slow=slow.next;
    22         }
    23     }
    24 }
    25 System.out.println("无环");
    26 return 0;
    
    复杂度分析

    链表长度为n,环节点个数为m

    则循环 t=n-m 次时,slow进入环中,此时,我们假设fast与slow相距x个节点,那么,经过t'次循环,二者相遇时,有:
    2t'=t'+(m-x) -> t'=m-x -> t'<=m.
    因此,总共循环了T=t+t' <= n. 算法复杂度为O(n).

  • 相关阅读:
    OWIN启动项的检测
    Katana概述
    update-database时出现Cannot attach the file
    数据并行
    SpinLock(自旋锁)
    屏障
    同步操作
    T4文本模板
    托管线程中的取消
    监视器
  • 原文地址:https://www.cnblogs.com/itjone/p/13834149.html
Copyright © 2011-2022 走看看