LeetCode算法學習之--鏈表--環形鏈表

你們好今天給你們分享下一道 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) */
複製代碼

1.png

解法二:Set 法

(這道題是借鑑的官網的題解,由於當時考慮的時候進階的問題 時間複雜度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) */
複製代碼

2.png

總結

這道題是簡單的題目 ,主要是考察採用什麼方式去證實「節點」被訪問過。

你們能夠看看我分享的一個專欄(前端搞算法)裏面有更多關於算法的題目的分享,但願可以幫到你們,我會盡可能保持天天晚上更新,若是喜歡的麻煩幫我點個贊,十分感謝

文章內容目的在於學習討論與分享學習算法過程當中的心得體會,文中部分素材來源網絡,若有侵權,請聯繫刪除,郵箱 182450609@qq.com

昨天去支持了鴻星爾克和蜜雪冰城,今天又去支持了匯源果汁,哈哈哈,對於良心企業及必須得給他們打打廣告。鄭州加油!河南加油!中國加油!

相關文章
相關標籤/搜索