链表问题--如何判断链表有环? - V2EX
kaolalicai

链表问题--如何判断链表有环?

  •  
  •   kaolalicai May 19, 2019 3306 views
    This topic created in 2556 days ago, the information mentioned may be changed or developed.

    一、题目描述

    如果有一个单向链表,链表当中有可能出现"环",就像下图这样,如何判断这个链表是有环链表?

    二、解题思路

    方案一:暴力法

    从头节点,依次遍历单链表的每一个节点,每到一个新的节点就头节点重新遍历之前的所有的节点,对比此时的节点,如果相同,证明该节点遍历过两次,以此说明链表是有环的

    Node p = head.next while(p.next!==null){ Node c = head while(c!==p){ c=c.next } if(c.next!==p.next){ return true } p = p.next } return false; 

    此方案时间复杂度为O(n^2),空间复杂度为 O(1)

    第二种方案:用 hashMap 缓存遍历的过的节点

    还是头节点进行遍历,每一次遍历新的节点时,对比存储到 hashMap 集合是否有相同的节点,有,证明有环,无,存储到集合中

    伪代码:

    Node p = head HashMap hm = new HashMap()<Node,Node> while(p!=null){ if(hm.get(p)){ return true } hm.put(p,p) p =p.next } 

    第三种方案:双指针遍历

    首先创建两个指针 1 和 2,同时指向这个链表的头节点。然后开始一个大循环,在循环体中,让指针 1 每次向下移动一个节点,让指针 2 每次向下移动两个节点,然后比较两个指针指向的节点是否相同。如果相同,则判断出链表有环,如果不同,则继续下一次循环

    伪代码:

    Node p = head Node q = head.next while(p!==q){ if(p.next==null) return false p =p.next if(q.next==null) return false if(q.next.next==null) return false q = q.next.next } return true 

    此方案的时间复杂度为 O(n),空间复杂度为 O(1)

    作者简介

    考拉后端开发小哥 Rowland,热爱运动还有点萌!

    11 replies    2019-05-20 16:12:46 +08:00
    Vegetable
        1
    Vegetable  
       May 19, 2019
    这...Leetcode 搬运工吗...
    JohnChiu
        2
    JohnChiu  
       May 19, 2019   2
    把 v2 当 csdn 了?
    helica
        3
    helica  
       May 19, 2019 via iPhone
    棒棒
    coffeSlider
        4
    coffeSlider  
       May 19, 2019 via Android
    帮楼主延伸一下,如何判断环的入口节点呢?
    yhxx
        5
    yhxx  
       May 19, 2019
    还以为是网易考拉。。。正准备看看是谁发的然后去嘲讽一下
    poplar50
        6
    poplar50  
       May 19, 2019 via Android
    来来再升级一下问题 找到两个链表的交点? ps: 链表可能有环
    Cbdy
        7
    Cbdy  
       May 19, 2019 via Android
    找本数据结构书看看吧,别一天到晚发这种帖子
    cxtrinityy
        8
    cxtrinityy  
       May 19, 2019 via Android
    就是有向图检测环吧,深度优先就可以做
    lizhuoli
        9
    lizhuoli  
       May 19, 2019 via iPhone
    这种无聊题怎么都搬上来了???
    taotaodaddy
        10
    taotaodaddy  
       May 19, 2019 via Android
    还可以升级一下:求一个链表中的环数
    chaplinj
        11
    chaplinj  
       May 20, 2019
    一句话就解决的事情
    About     Help     Advertise     Blog     API     FAQ     Solana     4285 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 55ms UTC 05:33 PVG 13:33 LAX 22:33 JFK 01:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86