你們好今天給你們分享下一道 LeetCode 簡單難度 的題目 [環形鏈表](leetcode-cn.com/problems/3s…)javascript
這裏主要是分享思路和註釋,供你們更好的理解題目解法,代碼部分是參考LeetCode 轉寫成javascript 代碼,前端
給定一個鏈表,判斷鏈表中是否有環。java
若是鏈表中有某個節點,能夠經過連續跟蹤 next 指針再次到達,則鏈表中存在環。 爲了表示給定鏈表中的環,咱們使用整數 pos 來表示鏈表尾鏈接到鏈表中的位置(索引從 0 開始)。 若是 pos 是 -1,則在該鏈表中沒有環。注意:pos 不做爲參數進行傳遞,僅僅是爲了標識鏈表的實際狀況。node
若是鏈表中存在環,則返回 true 。 不然,返回 false算法
進階:markdown
你能用 O(1)(即,常量)內存解決此問題嗎網絡
輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環,其尾部鏈接到第二個節點。
複製代碼
/* 分析oop
1.若是有環,必定有訪問過的狀況學習
2.如何想辦法證實這個點是否訪問過 就是這道題關鍵ui
解法
1.快慢指針
2.set法
思路
1.快指針一次走2步,慢指針一次走一步,
2.若是套圈了就必定有環
3.若是node.next 爲null,說明訪問到末尾了 結束循環
*/
var hasCycle = function (head) {
// 排序特殊的條件 如;[],[1]
if (head === null || head.next === null) {
return false;
}
let node1 = head; //慢指針
let node2 = head; //快指針
// 由於快指針確定在前面,若是快指針爲null或者快指針的next 爲null,
// 說明到了末尾了,結束循環
while (node2 !== null && node2.next !== null) {
// 慢指針一次走一步
node1 = node1.next;
// 快指針一次走兩步
node2 = node2.next.next;
// 相等說明被套圈了,有環
if (node1 === node2) {
return true;
}
}
return false;
};
/* 複雜度 時間 O(n) 空間 O(1) */
複製代碼
(這道題是借鑑的官網的題解,由於當時考慮的時候進階的問題 時間複雜度O(1),因此就忽略了這個簡單直白的方法)
代碼借鑑 leetcode-cn.com/problems/li…
思路
1.記錄訪問過的
2.若是節點的
*/
var hasCycle = function (head) {
// 使用set來記錄訪問過的節點
const set = new Set();
let cur = head;
//當cur ===null 則表示已經到了鏈表末尾
while (cur !== null) {
// 判斷是否有訪問過
if (set.has(cur)) {
return true;
}
set.add(cur);
cur = cur.next;
}
return false;
};
/* 複雜度 時間 O(n) 空間 O(1) */
複製代碼
這道題是簡單的題目 ,主要是考察採用什麼方式去證實「節點」被訪問過。
你們能夠看看我分享的一個專欄(前端搞算法)裏面有更多關於算法的題目的分享,但願可以幫到你們,我會盡可能保持天天晚上更新,若是喜歡的麻煩幫我點個贊,十分感謝
文章內容目的在於學習討論與分享學習算法過程當中的心得體會,文中部分素材來源網絡,若有侵權,請聯繫刪除,郵箱 182450609@qq.com
昨天去支持了鴻星爾克和蜜雪冰城,今天又去支持了匯源果汁,哈哈哈,對於良心企業及必須得給他們打打廣告。鄭州加油!河南加油!中國加油!