国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JAVASCRIPT算法(3)

Yi_Zhi_Yu / 3456人閱讀

摘要:首先是鏈表的定義語法搞錯(cuò)了。分析本題與編程之美上的從無頭單鏈表中刪除節(jié)點(diǎn)類似。但是如果節(jié)點(diǎn)是尾節(jié)點(diǎn)時(shí),該方法就行不通了。分析非遞歸的算法很簡(jiǎn)單,用三個(gè)臨時(shí)指針在鏈表上循環(huán)一遍即可。遞歸算法是先逆轉(zhuǎn)下一個(gè)節(jié)點(diǎn),再逆轉(zhuǎn)當(dāng)前節(jié)點(diǎn)。

鏈接描述## 面試前準(zhǔn)備了Promise的一種實(shí)現(xiàn)(大致理解和寫出來),二叉樹的構(gòu)建,刪除,查找,插入,快排的非遞歸,準(zhǔn)備了蠻多的吧,但是沒考慮鏈表。然后考個(gè)鏈表的反轉(zhuǎn),其實(shí)很簡(jiǎn)單,只不過有點(diǎn)懵,比我想的稍微難了點(diǎn),然后這種考慮算法的實(shí)現(xiàn)而忽略了特殊情況的考慮,雖然我確定我能寫出來,但是在那段懵的時(shí)間沒有。后來看到了我朋友寫的鏈表面試題,鏈接在此。

我朋友是做Android開發(fā)的,以java的形式舉了幾個(gè)例子。我是眼高手低,還是練練javascript的形式吧。

首先是鏈表的定義
/*class Node{ //語法搞錯(cuò)了。
constructor(val){
this.val= val;
this.next = null;
}
}*/
function Node(val){
this.val = val;
this.next = null;
}

題目描述:給定單鏈表中需要?jiǎng)h除的節(jié)點(diǎn)(不是尾節(jié)點(diǎn)),在 O(1) 時(shí)間刪除該節(jié)點(diǎn)。

分析:本題與《編程之美》上的「從無頭單鏈表中刪除節(jié)點(diǎn)」類似。主要思想都是「貍貓換太子」,即用下一個(gè)節(jié)點(diǎn)數(shù)據(jù)覆蓋要?jiǎng)h除的節(jié)點(diǎn),然后刪除下一個(gè)節(jié)點(diǎn)。但是如果節(jié)點(diǎn)是尾節(jié)點(diǎn)時(shí),該方法就行不通了。

function deleteNode(node){
 if(node==null||node.next==null) return ;
 node.val = node.next.val;
 node.next = node.next.next;
}

題目描述:輸出一個(gè)單鏈表的逆序反轉(zhuǎn)后的鏈表。

分析:非遞歸的算法很簡(jiǎn)單,用三個(gè)臨時(shí)指針 prev、cur、next 在鏈表上循環(huán)一遍即可。遞歸算法是先逆轉(zhuǎn)下一個(gè)節(jié)點(diǎn),再逆轉(zhuǎn)當(dāng)前節(jié)點(diǎn)。

有點(diǎn)傷心的題目啊,其實(shí)還是蠻簡(jiǎn)單的,就是在改變next的指向的時(shí)候,保留next指向的節(jié)點(diǎn)。

function reverseByLoop(head){
     if(head == null || head.next == null) return head;
     var pre = null,
         next;
     while(head!=null){
       next = head.next;
       head.next = pre;
       pre = head;
       head = next;
     }
     return pre;
}

function reverseByRecursion(head){
  if(head==null||head.next ==null) return head;
  //遞歸的好難理解。。
  var headOfNext = reverseByRecursion(head.next);
  head.next.next = head;
  head.next = null;
  return headOfNext;
  
}

遞歸有一種給我一個(gè)支點(diǎn)和足夠長(zhǎng)的棍,我就能翹起地球一樣的感覺。
比如原鏈表是這樣的結(jié)構(gòu)A->B->C->D->E.
既然這個(gè)function的目的是把鏈表倒序,那么如果我調(diào)用reverseByRecursion(B),
那么返回的結(jié)果一定是E,并且E->D->C->B.
現(xiàn)在我手中還有A,A->B。所以為了形成E->D->C->B->A, 只需要把B指向A,然后A指向NULL. 所以就是后續(xù)操作了。

那么還需要驗(yàn)證臨界情況,即最里面一層執(zhí)行的狀態(tài)能否達(dá)成逆轉(zhuǎn)鏈表的效果。
調(diào)用棧如下
reverseByRecursion(E)->return E;
reverseByRecursion(D)-> D.next.next=D;=>E->D D.next=NULL; return E; E->D->NULL
reverseByRecursion(C)-> C.next.next=C;=>D.next=C C.next=NULL; return E;=>E->D->C->NULL
reverseByRecursion(B)
reverseByRecursion(A)

先這樣吧。果然有點(diǎn)眼高手低。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/90130.html

相關(guān)文章

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

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

    cheukyin 評(píng)論0 收藏0
  • JavaScript深入淺出第3課:什么是垃圾回收算法?

    摘要:摘要是如何回收內(nèi)存的深入淺出系列深入淺出第課箭頭函數(shù)中的究竟是什么鬼深入淺出第課函數(shù)是一等公民是什么意思呢深入淺出第課什么是垃圾回收算法最近垃圾回收這個(gè)話題非?;穑蠹也荒茈S隨便便的扔垃圾了,還得先分類,這樣方便對(duì)垃圾進(jìn)行回收再利用。 摘要: JS是如何回收內(nèi)存的? 《JavaScript深入淺出》系列: JavaScript深入淺出第1課:箭頭函數(shù)中的this究竟是什么鬼? Jav...

    AaronYuan 評(píng)論0 收藏0
  • 常用排序算法JavaScript實(shí)現(xiàn)

    摘要:代碼實(shí)現(xiàn)六堆排序算法簡(jiǎn)介堆排序是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。九計(jì)數(shù)排序算法簡(jiǎn)介計(jì)數(shù)排序是一種穩(wěn)定的排序算法。計(jì)數(shù)排序不是比較排序,排序的速度快于任何比較排序算法。 贊助我以寫出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 1、插入排序 1)算法簡(jiǎn)介 插入排序(Insertion-Sort)的算法描述是一種簡(jiǎn)單直觀的排序算法。它...

    jerry 評(píng)論0 收藏0
  • 深入淺出 JavaScript 的 Array.prototype.sort 排序算法

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

    itvincent 評(píng)論0 收藏0
  • 【你該懂一點(diǎn)Javascript算法系列】之單源最短路徑 - Dijkstra算法

    摘要:算法系列單源最短路徑算法迪杰斯特拉算法是由荷蘭計(jì)算機(jī)科學(xué)家狄克斯特拉于年提出的,因此又叫狄克斯特拉算法。是從一個(gè)頂點(diǎn)到其余各頂點(diǎn)的最短路徑算法,解決的是有向圖中最短路徑問題。 Javascript算法系列 - 單源最短路徑 - Dijkstra算法 迪杰斯特拉算法是由荷蘭計(jì)算機(jī)科學(xué)家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是從一個(gè)頂點(diǎn)到其余各頂點(diǎn)的最短路徑算法,解決的是有...

    SoapEye 評(píng)論0 收藏0
  • JavaScript算法 ,Python算法,Go算法,java算法,系列之歸并排序

    摘要:常見的內(nèi)部排序算法有插入排序希爾排序選擇排序冒泡排序歸并排序快速排序堆排序基數(shù)排序等。用一張圖概括歸并排序英語,或,是創(chuàng)建在歸并操作上的一種有效的排序算法,效率為。 常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。用一張圖概括: showImg(https://segmentfault.com/img/bVNwuO?w=966&h=...

    zhou_you 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<