<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          每日算法:判斷一個(gè)單鏈表是否有環(huán)

          共 2512字,需瀏覽 6分鐘

           ·

          2021-09-05 22:57


          點(diǎn)擊上方 三分鐘學(xué)前端,關(guān)注公眾號(hào)

          回復(fù)交流,加入前端編程面試算法每日一題群


          面試官也在看的前端面試資料

          給定一個(gè)鏈表,判斷鏈表中是否有環(huán)。

          為了表示給定鏈表中的環(huán),我們使用整數(shù) pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。如果 pos-1,則在該鏈表中沒有環(huán)。

          示例 1:

          輸入:head = [3,2,0,-4], pos = 1
          輸出:true
          解釋:鏈表中有一個(gè)環(huán),其尾部連接到第二個(gè)節(jié)點(diǎn)。

          示例 2:

          輸入:head = [1,2], pos = 0
          輸出:true
          解釋:鏈表中有一個(gè)環(huán),其尾部連接到第一個(gè)節(jié)點(diǎn)。

          示例 3:

          輸入:head = [1], pos = -1
          輸出:false
          解釋:鏈表中沒有環(huán)。

          進(jìn)階:

          你能用 O(1)(即,常量)內(nèi)存解決此問題嗎?

          解法一:標(biāo)志法

          給每個(gè)已遍歷過的節(jié)點(diǎn)加標(biāo)志位,遍歷鏈表,當(dāng)出現(xiàn)下一個(gè)節(jié)點(diǎn)已被標(biāo)志時(shí),則證明單鏈表有環(huán)

          let hasCycle = function(head{
              while(head) {
                  if(head.flag) return true
                  head.flag = true
                  head = head.next
              }
              return false
          };

          時(shí)間復(fù)雜度:O(n)

          空間復(fù)雜度:O(n)

          解法二:利用 JSON.stringify() 不能序列化含有循環(huán)引用的結(jié)構(gòu)

          let hasCycle = function(head{
              try{
                  JSON.stringify(head);
                  return false;
              }
              catch(err){
                  return true;
              }
          };

          時(shí)間復(fù)雜度:O(n)

          空間復(fù)雜度:O(n)

          解法三:快慢指針(雙指針法)

          設(shè)置快慢兩個(gè)指針,遍歷單鏈表,快指針一次走兩步,慢指針一次走一步,如果單鏈表中存在環(huán),則快慢指針終會(huì)指向同一個(gè)節(jié)點(diǎn),否則直到快指針指向 null 時(shí),快慢指針都不可能相遇

          let hasCycle = function(head{
              if(!head || !head.next) {
                  return false
              }
              let fast = head.next.next, slow = head.next
              while(fast !== slow) {
                  if(!fast || !fast.next) return false
                  fast = fast.next.next
                  slow = slow.next
              }
              return true
          };

          時(shí)間復(fù)雜度:O(n)

          空間復(fù)雜度:O(1)

          來源:https://github.com/sisterAn/JavaScript-Algorithms

          最后

          歡迎關(guān)注「三分鐘學(xué)前端」,回復(fù)「交流」自動(dòng)加入前端三分鐘進(jìn)階群,每日一道編程算法面試題(含解答),助力你成為更優(yōu)秀的前端開發(fā)!

          號(hào)內(nèi)回復(fù):

          網(wǎng)絡(luò)」,自動(dòng)獲取三分鐘學(xué)前端網(wǎng)絡(luò)篇小書(90+頁)
          JS」,自動(dòng)獲取三分鐘學(xué)前端 JS 篇小書(120+頁)
          算法」,自動(dòng)獲取 github 2.9k+ 的前端算法小書
          面試」,自動(dòng)獲取 github 23.2k+ 的前端面試小書
          簡歷」,自動(dòng)獲取程序員系列的 120 套模版
          》》面試官也在看的前端面試資料《《
          “在看和轉(zhuǎn)發(fā)”就是最大的
          瀏覽 25
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  好吊妞视频在线观看 | 日韩人妻无码视频 | 一区二区三区无码免费观看 | 超碰青娱乐在线 | 黄色视频智之星 又粗又长又大 日日日日日日日日日日日日日日日干 |