摘要:繼續(xù)學(xué)習(xí)鏈表的算法鏈接題目描述刪除單鏈表倒數(shù)第個節(jié)點(diǎn),,盡量在一次遍歷中完成。如果條件是,那么被刪除的點(diǎn)就是,但是這樣刪不掉。思路很相似,那么三分之一,四分之一,五分之一,或者均分三段,均分四段也是類似的想法。
繼續(xù)學(xué)習(xí)鏈表的算法鏈接
題目描述:刪除單鏈表倒數(shù)第 n 個節(jié)點(diǎn),1 <= n <= length,盡量在一次遍歷中完成。
分析:看到題目時的第一想法是先遍歷一次計(jì)算出單鏈表的長度 length,然后在遍歷第二次刪除第 length - n + 1 個節(jié)點(diǎn),但是這需要遍歷兩次。正常的刪除第 n 個節(jié)點(diǎn)只需要遍歷一次就可以,如何只遍歷一次找到倒數(shù)第 n 個節(jié)點(diǎn)呢?可以設(shè)置兩個指針 p1、p2,首先 p1 和 p2 都指向 head,p2 移動到第 n 個節(jié)點(diǎn),然后 p1 和 p2 同時向后移動,當(dāng) p2 移動到末尾時,p1 剛好指向倒數(shù)第 n 個節(jié)點(diǎn)。因?yàn)樽詈笠獎h除倒數(shù)第 n 個節(jié)點(diǎn),所以可以找到倒數(shù)第 n + 1 個節(jié)點(diǎn),方便刪除節(jié)點(diǎn)。這種思想在學(xué)校的時候?qū)W習(xí)過,還是蠻有用的吧,還是可以學(xué)到很多東西的,只不過總是找了很多借口。
function Node(val){ //class的定義好像有點(diǎn)沒弄好 this.val = val; this.next = null; } function removeNthNodeFromEnd(head, location){ if(head == null) return head; var pointer1 = head; var pointer2 = head; for(var i = 0 ; i < location; i ++ ){ pointer2 = pointer2.next; if(pointer2==null&&i!=location-1) return null; //如果根本沒有n個元素,就沒有倒數(shù)第n個元素 } if(pointer2==null){ //總共就n個元素,那么head就是要刪除的那個點(diǎn),返回下一個節(jié)點(diǎn)作為頭節(jié)點(diǎn)就好了。 return pointer1.next; } while(pointer2.next!=null){ //如果條件是pointer2!=null,那么被刪除的點(diǎn)就是pointer1,但是這樣刪不掉。所以應(yīng)該記錄要刪除的節(jié)點(diǎn)的上一個節(jié)點(diǎn)。 pointer2=pointer2.next; pointer1=pointer1.next; } pointer1.next = pointer1.next.next;// return head; }
我自己測試了下,測試用例如下,可能構(gòu)建鏈表的過程有點(diǎn)傻。
var head = new Node("head"); var current = head,next = null; for(var i =5 ; i >0 ; i--){ next = new Node(i); current.next = next; current = next; } function showLinkedNode(head){ if(head==null) console.log("head is "+head); while(head!=null){ console.log(head.val); head = head.next; } } showLinkedNode(head); var result = removeNthNodeFromEnd(head,6); showLinkedNode(result);
結(jié)果是 head 5 4 3 2 1 和 5 4 3 2 1
如果removeNthNodeFromEnd(head,7),返回的是null。
showLinkedNode(head); var result = removeNthNodeFromEnd(head,3); showLinkedNode(result);
結(jié)果是head 5 4 2 1
還是得自己動手寫寫,可能以前能懂,但是過了一段時間以后就不懂了,讓往日的自己和后面的自己隔著時間對話。人并不總是在進(jìn)步,每一個時間點(diǎn)的思考以及結(jié)論都很有意義。
類似的問題
題目描述:求單鏈表的中間節(jié)點(diǎn),如果鏈表的長度為偶數(shù),返回中間兩個節(jié)點(diǎn)的任意一個,若為奇數(shù),則返回中間節(jié)點(diǎn)。
分析:這道題的思路和第 3 題「刪除單鏈表倒數(shù)第 n 個節(jié)點(diǎn)」很相似。如果要求只能遍歷一遍鏈表的花,也通過兩個指針來完成。兩個指針從頭節(jié)點(diǎn)開始,慢指針每次向后移動一步,快指針每次向后移動兩步,直到快指針移動到尾節(jié)點(diǎn)時,慢指針移動到中間節(jié)點(diǎn)。思路很相似,那么三分之一,四分之一,五分之一,或者均分三段,均分四段也是類似的想法。
function findMiddleNode(head){ if(head==null||head.next==null) return head; var fastPoint = head; var normalPoint = head; while(fastPoint!=null&&fastPoint.next!=null){ fastPoint = fastPoint.next.next; normalPoint = normalPoint.next; } return normalPoint; }
這個感覺比較簡單。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/90177.html
摘要:強(qiáng)烈推薦上值得前端學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)與算法項(xiàng)目,包含圖的演示過程與視頻講解。該倉庫包含了多種基于的算法與數(shù)據(jù)結(jié)構(gòu),提供進(jìn)一步閱讀的解釋和鏈接。數(shù)據(jù)結(jié)構(gòu)和算法必知必會的個代碼實(shí)現(xiàn)。 showImg(https://segmentfault.com/img/bVbvpYZ); 前言 算法為王。想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,就算招式練的再花哨,終究成不了高手;只有內(nèi)功深厚者,前端之路才會走得...
摘要:算法系列單源最短路徑算法迪杰斯特拉算法是由荷蘭計(jì)算機(jī)科學(xué)家狄克斯特拉于年提出的,因此又叫狄克斯特拉算法。是從一個頂點(diǎn)到其余各頂點(diǎn)的最短路徑算法,解決的是有向圖中最短路徑問題。 Javascript算法系列 - 單源最短路徑 - Dijkstra算法 迪杰斯特拉算法是由荷蘭計(jì)算機(jī)科學(xué)家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是從一個頂點(diǎn)到其余各頂點(diǎn)的最短路徑算法,解決的是有...
摘要:之所以把冒泡排序選擇排序插入排序放在一起比較,是因?yàn)樗鼈兊钠骄鶗r間復(fù)雜度都為。其中,冒泡排序就是原地排序算法。所以冒泡排序是穩(wěn)定的排序算法。選擇排序思路選擇排序算法的實(shí)現(xiàn)思路有點(diǎn)類似插入排序,也分已排序區(qū)間和未排序區(qū)間。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,...
摘要:實(shí)際上在這種將函數(shù)作為一等對象的語言里,策略模式已經(jīng)融入到了語言本身當(dāng)中,我們經(jīng)常使用高階函數(shù)來封裝不同的行為,并且把它傳遞到另一個函數(shù)中。 聲明:這個系列為閱讀《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》 ----曾探@著一書的讀書筆記 1.策略模式的定義 將不變的部分和變化的部分隔開是每個設(shè)計(jì)模式的主題。 定義一系列的算法,把它們一個個封裝起來,并且使它們可以相互替換。 2.策略模式...
摘要:筆者寫的數(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)功不行,就...
摘要:中的算法附道面試常見算法題解決方法和思路關(guān)注每日一道面試題詳解面試過程通常從最初的電話面試開始,然后是現(xiàn)場面試,檢查編程技能和文化契合度。值得記住的數(shù)組方法有和。一個好的解決方案是使用內(nèi)置的方法。 JavaScript中的算法(附10道面試常見算法題解決方法和思路) 關(guān)注github每日一道面試題詳解 Introduction 面試過程通常從最初的電話面試開始,然后是現(xiàn)場面試,檢查編程...
閱讀 2832·2023-04-25 18:58
閱讀 977·2021-11-25 09:43
閱讀 1210·2021-10-25 09:46
閱讀 3494·2021-09-09 11:40
閱讀 1679·2021-08-05 09:59
閱讀 869·2019-08-29 15:07
閱讀 956·2019-08-29 12:48
閱讀 695·2019-08-29 11:19