給定乙個鍊錶,判斷鍊錶中是否有環。
如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。 為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。注意:pos 不作為引數進行傳遞,僅僅是為了標識鍊錶的實際情況。
如果鍊錶中存在環,則返回 true 。 否則,返回 false 。
高階:你能用 o(1)(即,常量)記憶體解決此問題嗎?
拓展題目:
面試題 02.08. 環路檢測
遍歷所有節點,每次遍歷到乙個節點時,判斷該節點此前是否被訪問過。
具體地,我們可以使用雜湊表來儲存所有已經訪問過的節點。每次我們到達乙個節點,如果該節點已經存在於雜湊表中,則說明該鍊錶是環形鍊錶,否則就將該節點加入雜湊表中。重複這一過程,直到我們遍歷完整個鍊錶即可。
class solution
seen.insert(head);
head = head->next;
}return false;
}};
拓展 unordered_set
類模板std :: unordered_set
template < class key, // unordered_set::key_type/value_type
class hash = hash, // unordered_set::hasher
class pred = equal_to, // unordered_set::key_equal
class alloc = allocator// unordered_set::allocator_type
> class unordered_set;
無序集
無序集合是不按特定順序儲存唯一元素的容器,並允許根據其值快速檢索單個元素。
在unordered_set中,元素的值同時是它的key,可以唯一地標識它。鍵是不可變的,因此,無法在容器中一次修改unordered_set中的元素-儘管可以將其插入和刪除。
在內部,unordered_set中的元素未按任何特定順序排序,而是根據其雜湊值組織到儲存桶中,以允許直接通過其值快速訪問各個元素(平均平均時間複雜度恆定)。儘管
unordered_set容器通過其鍵訪問單個元素的速度要比set容器快,但是通常通過它們的元素子集進行範圍迭代的效率較低。 容器中的迭代器至少是前向迭代器。
設定兩個指標,快指標一次走兩步 慢指標一次走一步
如果有環,那麼快慢指標一定會相遇,如果不相遇,那麼不存在環
**:
/**
* definition for singly-linked list.
* struct listnode
* };
*/class solution
return true;
}};
LeetCode題解 141 環形鍊錶
給定乙個鍊錶,判斷鍊錶中是否有環。高階 你能否不使用額外空間解決此題?輸入 1 no cycle,輸出false 輸入 1,2 no cycle,輸出false 輸入 3,0,2,4 tail connects to node index 1,輸出true.我們首先畫一下如果鍊錶存在環的情況,如下圖...
LeetCode筆記 141環形鍊錶
題目 給定乙個鍊錶,判斷鍊錶中是否有環。高階 你能否不使用額外空間解決此題?思路 我本來自己想的是在環形鍊錶中。每乙個節點的下乙個節點都不可能為空。若為空的話返回false 若不為空的話,繼續迴圈,知道迴圈次數等於鍊錶的個數。實際上鍊表中的節點個數並不已知,所以該方法不可以。然後就直接看了leetc...
leetcode141 環形鍊錶
給定乙個鍊錶,判斷鍊錶中是否有環。高階 你能否不使用額外空間解決此題?思路 剛開始想著讓他迴圈下去,直到和頭結點相同的時候,就返回 true,否則就返回 false,但還是 too young too 實際上還是設定兩個指標,乙個快指標和乙個慢指標,只要是在環裡面,總會相遇的,就可 return t...