天天看點

LeetCode-141. 環形連結清單(java)

一、前言:

👨‍🎓作者:bug菌

✏️部落格:​​CSDN​​​、​​掘金​​等

💌公衆号:​​猿圈奇妙屋​​

🚫特别聲明:原創不易,轉載請附上原文出處連結和本文聲明,謝謝配合。

🙏版權聲明:文章裡可能部分文字或者圖檔來源于網際網路或者百度百科,如有侵權請聯系bug菌處理。

       哈喽,小夥伴們,我是bug菌呀👀。金三銀四,又到了刷題月啦。是以不管你是準備跳槽還是在職,都一起行動起來,順應這個時代月幹點該幹的事兒👣。是以,趕緊跟着bug菌的步伐卷起來吧⏰,變強從這一刻開始!➕🧈

       小夥伴們在批閱文章的過程中如果覺得文章對您有一絲絲幫助,還請别吝啬您手裡的贊呀,大膽的把文章點亮👍吧,您的點贊三連(收藏⭐️+關注👨‍🎓+留言📃)就是對bug菌我創作道路上最好的鼓勵與支援😘。時光不棄🏃🏻‍♀️,創作不停💕,加油☘️

二、題目描述:

題目:

       給你一個連結清單的頭節點 head ,判斷連結清單中是否有環。 

如果連結清單中有某個節點,可以通過連續跟蹤 next 指針再次到達,則連結清單中存在環。

為了表示給定連結清單中的環,評測系統内部使用整數 pos 來表示連結清單尾連接配接到連結清單中的位置(索引從 0 開始)。

注意:pos 不作為參數進行傳遞 。僅僅是為了辨別連結清單的實際情況。

如果連結清單中存在環 ,則傳回 true ;否則,傳回 false 。 

具體請看如下示例:

示例 1:

LeetCode-141. 環形連結清單(java)
輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:連結清單中有一個環,其尾部連接配接到第二個節點。      
LeetCode-141. 環形連結清單(java)

示例 2:

LeetCode-141. 環形連結清單(java)
輸入:head = [1,2], pos = 0
輸出:true
解釋:連結清單中有一個環,其尾部連接配接到第一個節點。      
LeetCode-141. 環形連結清單(java)

示例 3:

LeetCode-141. 環形連結清單(java)
輸入:head = [1], pos = -1
輸出:false
解釋:連結清單中沒有環。      
LeetCode-141. 環形連結清單(java)

提示:

  • 連結清單中節點的數目範圍是​

    ​[0, 104]​

  • ​-105 <= Node.val <= 105​

  • ​pos​

    ​​ 為​

    ​-1​

    ​ 或者連結清單中的一個 有效索引 。

題目來源:​​LeetCode官網​​

題目難度:⭐⭐

三、思路分析:

       其實我剛拿到這題的時候,給我的第一反應就是周遊所有節點,每次周遊到一個節點時,判斷該節點此前是否被通路過。具體做法如下:

  • 定義一個哈希表來存儲所有已經通路過的節點。
  • 每周遊到一個節點,如果該節點存在于哈希表中,則說明該連結清單是環形連結清單;否則就将該節點加入哈希表中。
  • 重複這一過程,直到周遊完整個連結清單即可。
  • 若完整周遊完,則說明該連結清單不是環形,傳回false即可。

四、算法實作:

AC代碼

具體算法代碼實作如下:

public class Solution {
    public boolean hasCycle(ListNode head) {

        //定義一個set
        Set<ListNode> nodeSet = new HashSet<ListNode>();
        while (head != null) {
            //如果nodeSet添加相同節點會傳回false 
            if (!nodeSet.add(head)) {
                return true;
            }
            head = head.next;
        }
        return false;
    }
}      
LeetCode-141. 環形連結清單(java)

五、總結:

哈希表法之leetcode送出運作結果截圖如下:

LeetCode-141. 環形連結清單(java)

複雜度分析:

  • 時間複雜度:O(n)。其中 n 是連結清單中的節點數。最壞情況下我們需要周遊每個節點一次。 空間複雜度:O(n)。其中 n 是連結清單中的節點數。主要為哈希表的開銷,最壞情況下我們需要将每個節點插入到哈希表中一次。

       這題其實找到思路還是相對簡單的,就是害怕有的同學會被套進去,人家隻是示範告訴你通過pos來告知你是否是環形且指向第幾個節點。我寫的也是最通常也是最能想到的一種思路。

       再者,解題道路千萬條,歡迎小夥伴們腦洞大開,如果你們有啥更好的想法或者思路,歡迎評論區告訴我哦,大家一起互相借鑒互相學習,方能成長的更快。

好啦,以上就是本期的所有内容啦,咱們下期見咯。

六、熱門推薦:

  1. ​​leetcode-9.回文數​​
  2. ​​leetcode-1.兩數之和​​
  3. ​​leetcode-13.羅馬數字轉整數​​
  4. ​​leetcode-14.最長公共字首​​
  5. ​​leetcode-20.有效的括号​​
  6. ​​leetcode-21.合并兩個有序連結清單​​
  7. ​​leetcode-26. 删除有序數組中的重複項​​

七、文末:

​​《每日一題LeetCode》​​,帶着你一塊兒刷題,專欄每一篇都附帶詳細解法,手把手帶你解題。

        一個人刷可能會覺得很累很難堅持,但是一群人刷就會覺得它是一件很有意義的事兒,互相督促互相鼓勵,一起變強。

       我是bug菌,一名想走👣出大山改變命運的程式猿。接下來的路還很長,都等待着我們去突破、去挑戰。來吧,小夥伴們,我們一起加油!未來皆可期,fighting!

最後送大家兩句話,與諸君共勉!

☘️做你想做的人,沒有時間限制,隻要願意,什麼時候都可以start,

🍀你能從現在開始改變,也可以一成不變,這件事,沒有規矩可言,你可以活出最精彩的自己。

LeetCode-141. 環形連結清單(java)

💌如果文章對您有所幫助,就請留下您的贊吧!(#^.^#);

💝如果喜歡bug菌分享的文章,就請給bug菌點個關注吧!(๑′ᴗ‵๑)づ╭❤~;

💗如果對文章有任何疑問,還請文末留言或者加群吧【QQ交流群:708072830】;