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