<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        JavaScript趣題:鏈表的歸并排序

        來源:懂視網 責編:小采 時間:2020-11-27 20:26:04
        文檔

        JavaScript趣題:鏈表的歸并排序

        JavaScript趣題:鏈表的歸并排序:歸并排序想必大家都知道,它的基本思想,是一個先分割,再合并的過程。那么,如何對一條單鏈表進行歸并排序呢?首先,我們需要一個分割鏈表的方法,如下面的偽代碼所展示的那樣:var source = 1 -> 3 -> 7 -> 8 -> 11 -> 1
        推薦度:
        導讀JavaScript趣題:鏈表的歸并排序:歸并排序想必大家都知道,它的基本思想,是一個先分割,再合并的過程。那么,如何對一條單鏈表進行歸并排序呢?首先,我們需要一個分割鏈表的方法,如下面的偽代碼所展示的那樣:var source = 1 -> 3 -> 7 -> 8 -> 11 -> 1

        歸并排序想必大家都知道,它的基本思想,是一個先分割,再合并的過程。

        那么,如何對一條單鏈表進行歸并排序呢?

        首先,我們需要一個分割鏈表的方法,如下面的偽代碼所展示的那樣:

        var source = 1 -> 3 -> 7 -> 8 -> 11 -> 12 -> 14 -> null 
        var front = new Node() 
        var back = new Node() 
        frontBackSplit(source, front, back) 
        front === 1 -> 3 -> 7 -> 8 -> null 
        back === 11 -> 12 -> 14 -> null

        它接收一個鏈表的尾指針作為參數,將該鏈表一分為二,也就是前半部分和后半部分。

        那么,這個中間的分界值該如何確定下來?

        可以使用快慢指針,快指針和慢指針同時從尾部出發,遍歷單鏈表,快指針每次都走2步,慢指針每次走1步,那么快指針肯定會先達到終點,而慢指針此時只走了一半的路程,也就是說,慢指針正好處于這個分界的位置。

        那剩下的就好辦了,在分界處截斷,該設置為null的設置好,第一階段我們就完成了。

        function Node(data) { 
         this.data = data === undefined ? null : data; 
         this.next = null; 
        } 
         
        function frontBackSplit(source, front, back) { 
         var total = 0; 
         var fast = source; 
         var slow = source; 
         var partial = null; 
         while(fast && fast.next){ 
         fast = fast.next.next; 
         slow = slow.next; 
         total++; 
         } 
         partial = slow; 
         while(slow){ 
         slow = slow.next; 
         total++; 
         } 
         if(total % 2 === 1){ 
         back.data = partial.next.data; 
         back.next = partial.next.next; 
         partial.next = null; 
         } 
         else{ 
         back.data = partial.data; 
         back.next = partial.next; 
         for(var e=source;e.next!=partial;e=e.next); 
         e.next = null; 
         } 
         front.data = source.data; 
         front.next = source.next; 
        }

        然后,鏈表打散了,甚至成了一個個不可分割的單元節點,我們就要想辦法將它們合并,組裝成新的有序的鏈表,于是,就需要下面的merge方法:

        var first = 2 -> 4 -> 6 -> 7 -> null 
        var second = 1 -> 3 -> 5 -> 6 -> 8 -> null 
        sortedMerge(first, second) === 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 6 -> 7 -> 8 -> null

        要寫好一個這樣的方法,考慮的case其實是有蠻多的,這在俺的代碼里就有所體現了:

        function sortedMerge(l1, l2) { 
         var newList = null; 
         var temp = null; 
         while(l1 && l2){ 
         if(l1.data > l2.data){ 
         if(!newList){ 
         newList = l2; 
         temp = l2; 
         } 
         else{ 
         temp.next = l2; 
         temp = l2; 
         } 
         l2 = l2.next; 
         } 
         else{ 
         if(!newList){ 
         newList = l1; 
         temp = l1; 
         } 
         else{ 
         temp.next = l1; 
         temp = l1; 
         } 
         l1 = l1.next; 
         } 
         } 
         if(l1){ 
         if(!newList){ 
         newList = l1; 
         } 
         else{ 
         temp.next = l1; 
         } 
         } 
         if(l2){ 
         if(!newList){ 
         newList = l2; 
         } 
         else{ 
         temp.next = l2; 
         } 
         } 
         return newList; 
        }

        好了,分割方法和合并方法都寫好了,就好比案板和菜刀都準備好,只需要切肉了。主方法這是一個遞歸的過程。

        function mergeSort(list) { 
         if(list && list.next){ 
         var front = new Node(); 
         var back = new Node(); 
         frontBackSplit(list, front, back); 
         return sortedMerge(mergeSort(front),mergeSort(back)); 
         } 
         return list; 
        }

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JavaScript趣題:鏈表的歸并排序

        JavaScript趣題:鏈表的歸并排序:歸并排序想必大家都知道,它的基本思想,是一個先分割,再合并的過程。那么,如何對一條單鏈表進行歸并排序呢?首先,我們需要一個分割鏈表的方法,如下面的偽代碼所展示的那樣:var source = 1 -> 3 -> 7 -> 8 -> 11 -> 1
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲性色AV日韩在线观看| 亚洲国产成人久久综合碰| 精品久久久久久亚洲| 亚洲女人影院想要爱| 精品视频在线免费观看| 国产特黄一级一片免费| 国产成人亚洲影院在线观看| 亚洲精品无码MV在线观看| 中文字幕一区二区三区免费视频| 久久九九AV免费精品| 最近的免费中文字幕视频| 亚洲国产成人精品女人久久久| 激情小说亚洲图片| 久久99精品国产免费观看| 女人被弄到高潮的免费视频| 无码专区一va亚洲v专区在线| 欧洲美女大片免费播放器视频| 99re6在线视频精品免费下载| 亚洲影院在线观看| 又硬又粗又长又爽免费看| 久久亚洲精品无码播放| 成全动漫视频在线观看免费高清版下载| 亚洲成AV人片在线观看无| 91大神免费观看| 不卡一卡二卡三亚洲| 久久久久国产免费| 国产婷婷综合丁香亚洲欧洲| 一级做性色a爰片久久毛片免费| 我们的2018在线观看免费高清| 亚洲国产成人精品激情| 国产aa免费视频| 成全在线观看免费观看大全| 91嫩草亚洲精品| a一级爱做片免费| 国产在线19禁免费观看国产| 一边摸一边爽一边叫床免费视频 | 黄a大片av永久免费| 亚洲综合婷婷久久| 猫咪社区免费资源在线观看 | 日本不卡免费新一二三区| 亚洲精品视频观看|