麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

javascript數(shù)據(jù)結(jié)構(gòu)之雙鏈表插入排序?qū)嵗斀?/h1>
2019-11-20 11:09:51
字體:
供稿:網(wǎng)友

本文實例講述了javascript數(shù)據(jù)結(jié)構(gòu)之雙鏈表插入排序?qū)崿F(xiàn)方法。分享給大家供大家參考,具體如下:

數(shù)組存儲前提下,插入排序算法,在最壞情況下,前面的元素需要不斷向后移,以便在插入點(diǎn)留出空位,讓目標(biāo)元素插入。

換成鏈表時,顯然無需做這種大量移動,根據(jù)每個節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)“指針”,向前找到插入點(diǎn)后,直接把目標(biāo)值從原鏈表上摘下,然后在插入點(diǎn)把鏈表斷成二截,然后跟目標(biāo)點(diǎn)重新接起來即可。

<!doctype html><html><head>  <title>雙鏈表-插入排序</title>  <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /></head><script type="text/javascript">  //節(jié)點(diǎn)類  var Node = function (pData) {    this.next = null; //后繼“指針”    this.prev = null; //前驅(qū)"指針"    this.data = pData;  }  //單鏈表(約定:頭節(jié)點(diǎn)不放內(nèi)容,當(dāng)哨兵位,有效元素從頭節(jié)點(diǎn)后的第1個元素開始)  var DbLinkList = function () {    this.head = new Node(null); //頭節(jié)點(diǎn)       //插入新元素    this.insert = function (pNodeValue) {      var newNode = new Node(pNodeValue);      //如果只有頭節(jié)點(diǎn)      if (this.head.next == null) {        this.head.next = newNode;        newNode.prev = this.head;        return;      }      //否則遍歷找到尾節(jié)點(diǎn)      var p = this.head;      while (p.next != null) {        p = p.next;      }      p.next = newNode;      newNode.prev = p;    }    //獲取第n個元素的數(shù)據(jù)值    this.getData = function (index) {      if (index < 1 || index > this.size) {        return null;      }      var p = this.head;      var i = 1;      while (p.next != null && i <= index) {        p = p.next;        i += 1;      }      return p.data;    }    //取尾節(jié)點(diǎn)    this.getTail = function () {      if (this.head.next == null) {        return null;      }      var p = this.head.next;      while (p.next != null) {        p = p.next;      }      return p;    }    //刪除指定位置的元素    this.removeAt = function (index) {      if (index < 1 || index > this.size) {        return null;      }      var p = this.head;      var i = 1;      //從頭開始遍歷,找到index位置的前一個元素      while (p.next != null && i < index) {        p = p.next;        i += 1;      }      p.next = p.next.next; //修改index位置前一個元素的后繼指針      p.next.prev = p;      return p.data; //返回刪除元素的值        }    //打印所有元素    this.print = function () {      document.write("<br/>");      if (this.head.next == null) {        return;      }      var p = this.head.next;      while (p.next != null) {        document.write(p.data + " ");        p = p.next;      }      document.write(p.data + " "); //最后一個元素,需要單獨(dú)打印      document.write("<br/>");    }    //從后打印所有元素    this.printFromBack = function () {      document.write("該鏈表共有" + this.size + "個元素,從后向前分別為:<br/>");      var tail = this.getTail();      var p = tail;      if (p == null) {        return;      }      while (p.prev != null) {        document.write(p.data + " ");        p = p.prev;      }      document.write("<br/>");    }    //插入排序    this.insertSort = function () {      if (this.head.next == null || this.head.next.next == null) {        return;      }      var p = this.head.next;      while (true) {        if (p == null) {          return;        }        var t = p.prev;        //向前查找p之前的插入點(diǎn)        while (t.prev != null && t.data > p.data) {          t = t.prev;        }        //如果插入點(diǎn)就是p的前驅(qū)節(jié)點(diǎn),不用調(diào)整,        //忽略,直接進(jìn)入下一輪        if (t.next == p) {          p = p.next;          continue;        }        //將p的后續(xù)節(jié)點(diǎn)先保護(hù)起來,以便下一輪循環(huán)時確定起始位置        var x = p.next;        //將p從鏈表上摘下        if (p.next != null) {          p.next.prev = p.prev;        }        p.prev.next = p.next;        //p插入到t之后        t.next.prev = p;        p.next = t.next;        t.next = p;        p.prev = t;        this.print(); //打印輸出,調(diào)試用          //重新將p定位到下一輪循環(huán)的"正確"起始節(jié)點(diǎn)        p = x;      }    }  }  var linkTest = new DbLinkList();  linkTest.insert(10);  linkTest.insert(9);  linkTest.insert(8);  linkTest.insert(7);  linkTest.insert(6);  linkTest.insert(5);  linkTest.insert(4);  linkTest.insert(3);  linkTest.insert(2);  linkTest.insert(1);  document.write("--排序前---<br/>")  linkTest.print();  linkTest.insertSort();  document.write("<br/>--排序后---<br/>")  linkTest.print();</script></html>

運(yùn)行結(jié)果如下:

 --排序前---10 9 8 7 6 5 4 3 2 1 9 10 8 7 6 5 4 3 2 1 8 9 10 7 6 5 4 3 2 1 7 8 9 10 6 5 4 3 2 1 6 7 8 9 10 5 4 3 2 1 5 6 7 8 9 10 4 3 2 1 4 5 6 7 8 9 10 3 2 1 3 4 5 6 7 8 9 10 2 1 2 3 4 5 6 7 8 9 10 1 1 2 3 4 5 6 7 8 9 10 --排序后---1 2 3 4 5 6 7 8 9 10

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

主站蜘蛛池模板: 亚欧在线免费观看 | 成人免费毛片一 | 亚洲精品免费播放 | 香蕉视频99 | 国产精品999在线观看 | 久久久久久中文字幕 | 日日艹夜夜艹 | 欧美色淫 | 精品成人av一区二区在线播放 | 久久国产不卡 | 久久色播 | 精品亚洲一区二区三区 | 国产精品视频1区 | 欧美一级黄色网 | 一级做人爱c黑人影片 | 国产一区网址 | 免费观看黄色片视频 | 亚洲视频观看 | 国产成人精品一区在线播放 | 国产一区二区三区高清 | 国产精品嘿咻嘿咻在线播放 | 87成人免费看片 | 日韩欧美电影一区二区三区 | 日韩视频一二三 | 成人短视频在线播放 | 欧美一级片免费在线观看 | 一级毛片在线免费播放 | 日韩精品网站在线观看 | 91精品久久久久久久久久久 | 成人免费在线视频 | 欧美成人免费 | 免费国产在线视频 | 久久sp| 特级黄色一级毛片 | 成人综合一区二区 | 久久精品在线免费观看 | 久久精品视频2 | 高清国产午夜精品久久久久久 | 狠狠操精品视频 | 日本欧美一区二区三区在线播 | 久久草在线视频免费 |