摘要:繼續(xù)鏈表算法有點(diǎn)恍恍惚惚。兩個指針先后進(jìn)入環(huán)里面,一個比另一個每次快一步,是不是一定會遇上。只是為了保證可以執(zhí)行操作。反正走了步相遇,那么快的領(lǐng)先慢的步,正好是一圈的長度。所以如果快節(jié)點(diǎn)從頭開始和慢節(jié)點(diǎn)以一樣的一格一格跑,必在入口處相遇。
繼續(xù)鏈表算法
有點(diǎn)恍恍惚惚。
題目描述:判斷一個單鏈表是否有環(huán)
分析:還是通過快慢指針來解決,兩個指針從頭節(jié)點(diǎn)開始,慢指針每次向后移動一步,快指針每次向后移動兩步,如果存在環(huán),那么兩個指針一定會在環(huán)內(nèi)相遇。首先單鏈表有環(huán)是什么一種結(jié)構(gòu)呢? 小b這種結(jié)構(gòu)么? 因?yàn)橹荒苁菃畏较虻闹敢?,所以?yīng)該是小b這種結(jié)構(gòu)。兩個指針先后進(jìn)入環(huán)里面,一個比另一個每次快一步,是不是一定會遇上。是的。那么如果快兩步呢?就是一個指針每次走3步,另一個每次走一步?相遇的話,快的那個是不是一定領(lǐng)先慢的那個若干個圈的長度?假設(shè)經(jīng)過x步相遇,那么領(lǐng)先2x個節(jié)點(diǎn)。所以圈內(nèi)節(jié)點(diǎn)數(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)的入口點(diǎn)
分析:由上題可知,按照 p2 每次兩步,p1 每次一步的方式走,發(fā)現(xiàn) p2 和 p1 重合,確定了單向鏈表有環(huán)路了。接下來,讓 p2 回到鏈表的頭部,重新走,每次步長不是走 2 了,而是走 1,那么當(dāng) p1 和 p2 再次相遇的時候,就是在環(huán)路的入口點(diǎ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é)點(diǎn)到圈的入口要走m步,那么慢節(jié)點(diǎn)在圈內(nèi)走了x-m步,從相遇的節(jié)點(diǎn)到入口節(jié)點(diǎn),差x-(x-m)=m步。
所以如果快節(jié)點(diǎn)從頭開始和慢節(jié)點(diǎn)以一樣的一格一格跑,必在入口處相遇。
還是畫個圖吧。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90219.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)功深厚者,前端之路才會走得...
摘要:之所以把冒泡排序選擇排序插入排序放在一起比較,是因?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ù)據(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)功不行,就...
摘要:快速排序是不穩(wěn)定的排序算法。瀏覽器的實(shí)現(xiàn)不同有什么影響排序算法不穩(wěn)定有什么影響舉個例子某市的機(jī)動車牌照拍賣系統(tǒng),最終中標(biāo)的規(guī)則為按價格進(jìn)行倒排序相同價格則按照競標(biāo)順位即價格提交時間進(jìn)行正排序。 本文要解決的問題 1、找出 Array.prototype.sort 使用的什么排序算法 2、用一種直觀的方式展示 Array.prototype.sort 的時間復(fù)雜度,看看它有多快? 3、...
摘要:因?yàn)槭窃谝呀?jīng)分組排序過的基礎(chǔ)上進(jìn)行插入排序,所以效率高。本質(zhì)上來看,快速排序應(yīng)該算是在冒泡排序基礎(chǔ)上的遞歸分治法。形成左右兩個分區(qū),再遞歸按之前的步驟排序。 算法復(fù)雜度 不是科班生的我,第一次看見時間復(fù)雜度之類的名詞表示很懵逼,所以就找了網(wǎng)上的資料補(bǔ)習(xí)了下: 時間復(fù)雜度:是指執(zhí)行算法所需要的計算工作量 空間復(fù)雜度:是指算法在計算機(jī)內(nèi)執(zhí)行時所需存儲空間的度量 排序算法穩(wěn)定性: 假定在待...
摘要:棧被稱為一種后入先出的數(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)(如鏈表,棧,隊(duì)列,圖等),...
閱讀 1879·2019-08-30 15:53
閱讀 3205·2019-08-30 15:44
閱讀 2813·2019-08-26 13:31
閱讀 1959·2019-08-26 12:10
閱讀 805·2019-08-26 11:01
閱讀 2134·2019-08-23 15:32
閱讀 1591·2019-08-23 13:43
閱讀 2548·2019-08-23 11:58