成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JAVASCRIPT算法(5)

ysl_unh / 782人閱讀

摘要:繼續(xù)鏈表算法有點恍恍惚惚。兩個指針先后進入環(huán)里面,一個比另一個每次快一步,是不是一定會遇上。只是為了保證可以執(zhí)行操作。反正走了步相遇,那么快的領(lǐng)先慢的步,正好是一圈的長度。所以如果快節(jié)點從頭開始和慢節(jié)點以一樣的一格一格跑,必在入口處相遇。

繼續(xù)鏈表算法
有點恍恍惚惚。

題目描述:判斷一個單鏈表是否有環(huán)

分析:還是通過快慢指針來解決,兩個指針從頭節(jié)點開始,慢指針每次向后移動一步,快指針每次向后移動兩步,如果存在環(huán),那么兩個指針一定會在環(huán)內(nèi)相遇。首先單鏈表有環(huán)是什么一種結(jié)構(gòu)呢? 小b這種結(jié)構(gòu)么? 因為只能是單方向的指引,所以應(yīng)該是小b這種結(jié)構(gòu)。兩個指針先后進入環(huán)里面,一個比另一個每次快一步,是不是一定會遇上。是的。那么如果快兩步呢?就是一個指針每次走3步,另一個每次走一步?相遇的話,快的那個是不是一定領(lǐng)先慢的那個若干個圈的長度?假設(shè)經(jīng)過x步相遇,那么領(lǐng)先2x個節(jié)點。所以圈內(nèi)節(jié)點數(shù)一定要是偶數(shù)才行?先想題目吧。

  function linkedListWithCircle(head){
      if(head==null||head.next==null) return false;
      var fastNode = head;
      var normalNode = head;
      while(fastNode!=null&&fastNode.next!=null){//只是為了保證可以執(zhí)行fastNode.next.next操作。避免null.next錯誤。
          fastNode = fastNode.next.next;
          normalNode = normalNode.next;
          if(normalNode==fastNode) return true;
      }
      return false;
  }

題目描述:判斷單鏈表是否有環(huán),如果有,找到環(huán)的入口點

分析:由上題可知,按照 p2 每次兩步,p1 每次一步的方式走,發(fā)現(xiàn) p2 和 p1 重合,確定了單向鏈表有環(huán)路了。接下來,讓 p2 回到鏈表的頭部,重新走,每次步長不是走 2 了,而是走 1,那么當 p1 和 p2 再次相遇的時候,就是在環(huán)路的入口點。加深思考。

 function findLoopPort(head){
      if(head==null||head.next==null) return null;
      var fastNode = head;
      var normalNode = head;
      var hasCircle = false;
      while(fastNode != null&&fastNode.next != null){
          fastNode = fastNode.next.next;
          normalNode = normalNode.next;
          if(normalNode == fastNode) {
              hasCircle = true;
              break;
          }
      }
      if(!hasCircle) return null;//原本想return false,后來發(fā)現(xiàn)還是null好。
      var fastNode = head;
      while(fastNode != normalNode){
          fastNode = fastNode.next;
          normalNode = normalNode.next;
      }
      return fastNode;
  }

想畫個圖來著。還是算了吧。反正走了x步相遇,那么快的領(lǐng)先慢的x步,正好是一圈的長度。
假設(shè)從頭節(jié)點到圈的入口要走m步,那么慢節(jié)點在圈內(nèi)走了x-m步,從相遇的節(jié)點到入口節(jié)點,差x-(x-m)=m步。
所以如果快節(jié)點從頭開始和慢節(jié)點以一樣的一格一格跑,必在入口處相遇。
還是畫個圖吧。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/90219.html

相關(guān)文章

  • 優(yōu)秀程序員都應(yīng)該學(xué)習(xí)的 GitHub 上開源的數(shù)據(jù)結(jié)構(gòu)與算法項目

    摘要:強烈推薦上值得前端學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)與算法項目,包含圖的演示過程與視頻講解。該倉庫包含了多種基于的算法與數(shù)據(jù)結(jié)構(gòu),提供進一步閱讀的解釋和鏈接。數(shù)據(jù)結(jié)構(gòu)和算法必知必會的個代碼實現(xiàn)。 showImg(https://segmentfault.com/img/bVbvpYZ); 前言 算法為王。想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,就算招式練的再花哨,終究成不了高手;只有內(nèi)功深厚者,前端之路才會走得...

    cheukyin 評論0 收藏0
  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 冒泡排序、插入排序、選擇排序

    摘要:之所以把冒泡排序選擇排序插入排序放在一起比較,是因為它們的平均時間復(fù)雜度都為。其中,冒泡排序就是原地排序算法。所以冒泡排序是穩(wěn)定的排序算法。選擇排序思路選擇排序算法的實現(xiàn)思路有點類似插入排序,也分已排序區(qū)間和未排序區(qū)間。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,...

    canger 評論0 收藏0
  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 十大經(jīng)典排序算法匯總

    摘要:筆者寫的數(shù)據(jù)結(jié)構(gòu)與算法之美系列用的語言是,旨在入門數(shù)據(jù)結(jié)構(gòu)與算法和方便以后復(fù)習(xí)。這應(yīng)該是目前較為簡單的十大經(jīng)典排序算法的文章講解了吧。比如原本在的前面,而,排序之后,在的后面十大經(jīng)典排序算法冒泡排序思想冒泡排序只會操作相鄰的兩個數(shù)據(jù)。 showImg(https://segmentfault.com/img/bVbvHet); 1. 前言 算法為王。想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,就...

    zsy888 評論0 收藏0
  • 深入淺出 JavaScript 的 Array.prototype.sort 排序算法

    摘要:快速排序是不穩(wěn)定的排序算法。瀏覽器的實現(xiàn)不同有什么影響排序算法不穩(wěn)定有什么影響舉個例子某市的機動車牌照拍賣系統(tǒng),最終中標的規(guī)則為按價格進行倒排序相同價格則按照競標順位即價格提交時間進行正排序。 本文要解決的問題 1、找出 Array.prototype.sort 使用的什么排序算法 2、用一種直觀的方式展示 Array.prototype.sort 的時間復(fù)雜度,看看它有多快? 3、...

    itvincent 評論0 收藏0
  • javascript中可能用到的算法排序

    摘要:因為是在已經(jīng)分組排序過的基礎(chǔ)上進行插入排序,所以效率高。本質(zhì)上來看,快速排序應(yīng)該算是在冒泡排序基礎(chǔ)上的遞歸分治法。形成左右兩個分區(qū),再遞歸按之前的步驟排序。 算法復(fù)雜度 不是科班生的我,第一次看見時間復(fù)雜度之類的名詞表示很懵逼,所以就找了網(wǎng)上的資料補習(xí)了下: 時間復(fù)雜度:是指執(zhí)行算法所需要的計算工作量 空間復(fù)雜度:是指算法在計算機內(nèi)執(zhí)行時所需存儲空間的度量 排序算法穩(wěn)定性: 假定在待...

    Bamboy 評論0 收藏0
  • JavaScript數(shù)據(jù)結(jié)構(gòu)和算法

    摘要:棧被稱為一種后入先出的數(shù)據(jù)結(jié)構(gòu)。散列使用的數(shù)據(jù)結(jié)構(gòu)叫做散列表。這些操作需要求助于其他數(shù)據(jù)結(jié)構(gòu),比如下面介紹的二叉查找樹。 前言 在過去的幾年中,得益于Node.js的興起,JavaScript越來越廣泛地用于服務(wù)器端編程。鑒于JavaScript語言已經(jīng)走出了瀏覽器,程序員發(fā)現(xiàn)他們需要更多傳統(tǒng)語言(比如C++和Java)提供的工具。這些工具包括傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)(如鏈表,棧,隊列,圖等),...

    EastWoodYang 評論0 收藏0

發(fā)表評論

0條評論

ysl_unh

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<