【圖解連結串列類面試題】環形連結串列
目錄
題目描述
題目地址:https://leetcode-cn.com/problems/linked-list-cycle/
給定一個連結串列,判斷連結串列中是否有環。為了表示給定連結串列中的環,我們使用整數 pos 來表示連結串列尾連線到連結串列中的位置(索引從 0 開始)。如果 pos 是 -1,則在該連結串列中沒有環。
示例 1:輸入:head = [3,2,0,-4], pos = 1 輸出:true 解釋:連結串列中有一個環,其尾部連線到第二個節點
示例 2:輸入:head = [1,2], pos = 0 輸出:true 解釋:連結串列中有一個環,其尾部連線到第一個節點
示例 3:輸入:head = [1], pos = -1 輸出:false 解釋:連結串列中沒有環
進階:你能用 O(1)(即,常量)記憶體解決此問題嗎?
利用set求解
我們可以利用set這個資料結構來解決這道題,首先定義一個Set。
之後遍歷連結串列的節點,每遍歷一個節點,就將這個節點的元素放入set中,如果這個連結串列沒有環,那麼最終遍歷就結束了。
如果連結串列有環的話,那麼肯定有一個元素會被訪問兩次,當第二次訪問這個元素的時候,set中就有記錄了,這樣就可以判斷出連結串列是否有環了。
java實現
public class Solution {
public boolean hasCycle(ListNode head) {
Set s = new HashSet();
//定義一個set,然後不斷遍歷
while(head!=null) {
//只要某個節點在set中出現過,說明遍歷到重複元素了
if(s.contains(head)) {
return true;
}
s.add(head);
head = head.next;
}
return false;
}
}
python實現
class Solution(object):
def hasCycle(self, head):
#定義一個set,然後不斷遍歷連結串列
s = set()
while head:
#如果某個節點在set中,說明遍歷到重複元素了,也就是有環
if head in s:
return True
s.add(head)
head = head.next
return False
快慢指標解法
假設有個圓形的操場,操場上有a和b兩個人,a和b最開始的時候是站在一起的
假設b的速度是a的一倍,b不停的跑把a甩在身後了
b跑了N圈之後,終於追上a了
按照這個思路,我們可以假設有a和b兩個指標,一個慢一個快,如果連結串列是有環狀的,那麼走的快的那個指標遲早會跟慢指標重合的
java實現
public class Solution {
public boolean hasCycle(ListNode head) {
if(head==null || head.next==null) {
return false;
}
//定義兩個指標i和j,i是慢指標,j是快指標
ListNode i = head;
ListNode j = head.next;
while(j!=null && j.next!=null) {
if(i==j) {
return true;
}
//i每次走一步,j每次走兩步
i = i.next;
j = j.next.next;
}
return false;
}
}
python實現
class Solution(object):
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if not (head and head.next):
return False
#定義兩個指標i和j,i為慢指標,j為快指標
i,j = head,head.next
while j and j.next:
if i==j:
return True
# i每次走一步,j每次走兩步
i,j = i.next, j.next.next
return False
歡迎掃描關注公眾號 ,有更多圖解的演算法面試題等你哦~
相關文章
- 【圖解連結串列類面試題】移除連結串列元素圖解面試題
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- 環形連結串列II
- 連結串列面試題(十一)---求帶環單連結串列 環的入口點面試題
- 連結串列面試題(九)---判斷一個連結串列是否帶環面試題
- 連結串列面試題(十)---求帶環單連結串列的環的長度面試題
- 環形連結串列_相交連結串列_多數元素(java語言)Java
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 連結串列專題——面試中常見的連結串列問題面試
- 連結串列面試題(八)---約瑟夫環面試題
- 141. 環形連結串列
- 【LeetCode-連結串列】面試題-反轉連結串列LeetCode面試題
- 連結串列面試題(七)---合併兩個有序連結串列面試題
- 連結串列面試題(十三)---求兩個都不帶環的連結串列相交的結點面試題
- (連結串列)連結串列的排序問題排序
- 連結串列面試題(十二)---判斷兩個都不帶環的連結串列是否相交面試題
- Python實現環形連結串列詳解Python
- 連結串列面試題(四)---查詢連結串列的中間節點面試題
- java環形連結串列約瑟夫環問題筆記Java筆記
- 連結串列-雙向連結串列
- 連結串列-迴圈連結串列
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- 連結串列面試題(六)---刪除單連結串列倒數第k個結點面試題
- 連結串列4: 迴圈連結串列
- 連結串列-單連結串列實現
- **24. 兩兩交換連結串列中的節點****19.刪除連結串列的倒數第N個節點****面試題 02.07. 連結串列相交****142.環形連結串列II**面試題
- 連結串列(LinkedList)解題總結
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- 連結串列入門與插入連結串列
- Day 4 | 24. 兩兩交換連結串列中的節點 、 19.刪除連結串列的倒數第N個節點 、面試題 02.07. 連結串列相交 、142.環形連結串列II面試題
- 搞懂單連結串列常見面試題面試題
- 演算法141. 環形連結串列演算法
- 每日演算法隨筆:環形連結串列演算法
- 連結串列
- 連結串列面試題(五)---尋找連結串列的倒數第k個結點O(N)面試題
- 連結串列面試題(一)---刪除一個無頭單連結串列的非尾結點面試題
- 判斷單連結串列是否存在環,判斷兩個連結串列是否相交問題詳解
- 第四天:● 24. 兩兩交換連結串列中的節點 ● 19.刪除連結串列的倒數第N個節點 ● 面試題 02.07. 連結串列相交 ● 142.環形連結串列II面試題