成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

數(shù)據(jù)結(jié)構(gòu)與算法隨筆之鏈表-鏈表是否有環(huán)(二)

molyzzx / 3324人閱讀

摘要:初始化時(shí)指針走兩步,指針走一步,不停遍歷的變化最后快慢指針又相遇了,循環(huán)結(jié)束,代碼實(shí)現(xiàn)如下復(fù)雜度分析,假設(shè)鏈表長度為時(shí)間復(fù)雜度,鏈表無環(huán)時(shí),快指針會(huì)先到達(dá)尾部,時(shí)間就是如果有環(huán),那么假設(shè)環(huán)部長度為,時(shí)間就是,也就是空間復(fù)雜度

上一篇文章我們分析了下鏈表之反轉(zhuǎn)單向鏈表,這篇文章我們來分析下另外一個(gè)關(guān)于鏈表的經(jīng)典題目。

判斷鏈表是否有環(huán)(在leetcode上的題目地址:環(huán)形鏈表)

題目描述

給定一個(gè)鏈表,判斷鏈表中是否有環(huán)

解決方案

一、可以使用hash表來實(shí)現(xiàn),遍歷鏈表,每個(gè)節(jié)點(diǎn)放入hash表中,如果hash表中包含了某個(gè)節(jié)點(diǎn),那么說明有重復(fù)節(jié)點(diǎn)存在,即是有環(huán)。如果沒環(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類參照上篇文章

復(fù)雜度分析,假設(shè)鏈表長度為n

時(shí)間復(fù)雜度:每個(gè)元素都要遍歷一遍,所以時(shí)間為O(n),每次訪問hash表時(shí)間為O(1)。

空間復(fù)雜度:O(n),n個(gè)元素都會(huì)添加到hash表中。

二、上面這種方法可以解決,但是需要借助額外的空間復(fù)雜度,能否不使用額外空間解決此題呢?答案是有的,使用快慢指針,想象下,兩個(gè)人在一個(gè)環(huán)形跑道上賽跑,跑得快的一定會(huì)追上跑的慢的那個(gè)人吧。下面用圖示來展示下整個(gè)過程。

初始化時(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è)鏈表長度為n

時(shí)間復(fù)雜度:O(n),鏈表無環(huán)時(shí),快指針會(huì)先到達(dá)尾部,時(shí)間就是O(n);如果有環(huán),那么假設(shè)環(huán)部長度為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://m.hztianpu.com/yun/71735.html

相關(guān)文章

  • 學(xué)習(xí)數(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ù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之二叉搜索樹簡單介紹鏈表鏈表一種常見的數(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ù)...

    jerryloveemily 評(píng)論0 收藏0
  • 每周一練 之 數(shù)據(jù)結(jié)構(gòu)算法(LinkedList)

    摘要:不同鏈表是鏈?zhǔn)降拇鎯?chǔ)結(jié)構(gòu)數(shù)組是順序的存儲(chǔ)結(jié)構(gòu)。從列表中,移除并返回特定位置的一項(xiàng)。返回列表中元素個(gè)數(shù),與數(shù)組的屬性類似。提示端優(yōu)先使用以上的語法實(shí)現(xiàn)。不要忘記在最后返回新的頭引用復(fù)雜度分析時(shí)間復(fù)雜度。假設(shè)是列表的長度,時(shí)間復(fù)雜度是。 這是第三周的練習(xí)題,原本應(yīng)該先發(fā)第二周的,因?yàn)橹苣┑臅r(shí)候,我的母親大人來看望她的寶貝兒子,哈哈,我得帶她看看廈門這座美麗的城市呀。 這兩天我抓緊整...

    妤鋒シ 評(píng)論0 收藏0
  • 利用PHP實(shí)現(xiàn)《劍指 offer》鏈表數(shù)據(jù)結(jié)構(gòu)算法實(shí)戰(zhà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),所以不可能直接從后往前打印。這種逆序的算法(策略)我們常用棧這...

    hiYoHoo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<