摘要:初始化時指針走兩步,指針走一步,不停遍歷的變化最后快慢指針又相遇了,循環(huán)結(jié)束,代碼實現(xiàn)如下復雜度分析,假設(shè)鏈表長度為時間復雜度,鏈表無環(huán)時,快指針會先到達尾部,時間就是如果有環(huán),那么假設(shè)環(huán)部長度為,時間就是,也就是空間復雜度
上一篇文章我們分析了下鏈表之反轉(zhuǎn)單向鏈表,這篇文章我們來分析下另外一個關(guān)于鏈表的經(jīng)典題目。
判斷鏈表是否有環(huán)(在leetcode上的題目地址:環(huán)形鏈表)
題目描述給定一個鏈表,判斷鏈表中是否有環(huán)
解決方案一、可以使用hash表來實現(xiàn),遍歷鏈表,每個節(jié)點放入hash表中,如果hash表中包含了某個節(jié)點,那么說明有重復節(jié)點存在,即是有環(huán)。如果沒環(huán),那么鏈表會遍歷結(jié)束。代碼如下:
public static> boolean hasCycle1(Node head) { HashSet > set = new HashSet<>(); for(Node n=head;n!=null;n=n.getNext()) { if(set.contains(n)) { return true; } set.add(n); } return false; }
備注Node類參照上篇文章
復雜度分析,假設(shè)鏈表長度為n
時間復雜度:每個元素都要遍歷一遍,所以時間為O(n),每次訪問hash表時間為O(1)。
空間復雜度:O(n),n個元素都會添加到hash表中。
二、上面這種方法可以解決,但是需要借助額外的空間復雜度,能否不使用額外空間解決此題呢?答案是有的,使用快慢指針,想象下,兩個人在一個環(huán)形跑道上賽跑,跑得快的一定會追上跑的慢的那個人吧。下面用圖示來展示下整個過程。
初始化時:
fast指針走兩步,slow指針走一步,不停遍歷的變化:
最后快慢指針又相遇了,循環(huán)結(jié)束,代碼實現(xiàn)如下:
public static> boolean hasCycle(Node head) { if(head == null || head.getNext() == null) { return false; } Node slow = head; Node fast = head; while(fast != null && fast.getNext() != null) { slow = slow.getNext(); fast = fast.getNext().getNext(); if(slow == fast) { return true; } } return false; }
復雜度分析,假設(shè)鏈表長度為n
時間復雜度:O(n),鏈表無環(huán)時,快指針會先到達尾部,時間就是O(n);如果有環(huán),那么假設(shè)環(huán)部長度為K,時間就是O(n+k),也就是O(n)
空間復雜度:O(1)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71735.html
摘要:本系列所有文章第一篇文章學習數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列第二篇文章學習數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章學習數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章學習數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章學習數(shù)據(jù)結(jié)構(gòu)與算法之二叉搜索樹簡單介紹鏈表鏈表一種常見的數(shù)據(jù)結(jié)構(gòu),可 本系列所有文章:第一篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊列第二篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章:學習數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章:學習數(shù)...
摘要:不同鏈表是鏈式的存儲結(jié)構(gòu)數(shù)組是順序的存儲結(jié)構(gòu)。從列表中,移除并返回特定位置的一項。返回列表中元素個數(shù),與數(shù)組的屬性類似。提示端優(yōu)先使用以上的語法實現(xiàn)。不要忘記在最后返回新的頭引用復雜度分析時間復雜度。假設(shè)是列表的長度,時間復雜度是。 這是第三周的練習題,原本應該先發(fā)第二周的,因為周末的時候,我的母親大人來看望她的寶貝兒子,哈哈,我得帶她看看廈門這座美麗的城市呀。 這兩天我抓緊整...
摘要:一定要認真看分析注釋題目要求題目描述輸入一個鏈表,從尾到頭打印鏈表每個節(jié)點的值。分析因為鏈表只有知道當前結(jié)點才能知道下一結(jié)點,所以不可能直接從后往前打印。 一定要認真看 分析 | 注釋 | 題目要求 Question 1 題目描述:輸入一個鏈表,從尾到頭打印鏈表每個節(jié)點的值。 分析:因為鏈表只有知道當前結(jié)點才能知道下一結(jié)點,所以不可能直接從后往前打印。這種逆序的算法(策略)我們常用棧這...
閱讀 1991·2021-10-25 09:48
閱讀 2842·2021-09-22 14:59
閱讀 1779·2019-08-29 16:52
閱讀 887·2019-08-29 16:07
閱讀 2328·2019-08-29 12:38
閱讀 1803·2019-08-26 13:23
閱讀 907·2019-08-26 11:49
閱讀 3303·2019-08-26 10:56