javascript数据结构之双链表插入排序实例详解


Posted in Javascript onNovember 25, 2015

本文实例讲述了javascript数据结构之双链表插入排序实现方法。分享给大家供大家参考,具体如下:

数组存储前提下,插入排序算法,在最坏情况下,前面的元素需要不断向后移,以便在插入点留出空位,让目标元素插入。

换成链表时,显然无需做这种大量移动,根据每个节点的前驱节点“指针”,向前找到插入点后,直接把目标值从原链表上摘下,然后在插入点把链表断成二截,然后跟目标点重新接起来即可。

<!doctype html>
<html>
<head>
  <title>双链表-插入排序</title>
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head>
<script type="text/javascript">
  //节点类
  var Node = function (pData) {
    this.next = null; //后继“指针”
    this.prev = null; //前驱"指针"
    this.data = pData;
  }
  //单链表(约定:头节点不放内容,当哨兵位,有效元素从头节点后的第1个元素开始)
  var DbLinkList = function () {
    this.head = new Node(null); //头节点   
    //插入新元素
    this.insert = function (pNodeValue) {
      var newNode = new Node(pNodeValue);
      //如果只有头节点
      if (this.head.next == null) {
        this.head.next = newNode;
        newNode.prev = this.head;
        return;
      }
      //否则遍历找到尾节点
      var p = this.head;
      while (p.next != null) {
        p = p.next;
      }
      p.next = newNode;
      newNode.prev = p;
    }
    //获取第n个元素的数据值
    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;
    }
    //取尾节点
    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 + " "); //最后一个元素,需要单独打印
      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之前的插入点
        while (t.prev != null && t.data > p.data) {
          t = t.prev;
        }
        //如果插入点就是p的前驱节点,不用调整,
        //忽略,直接进入下一轮
        if (t.next == p) {
          p = p.next;
          continue;
        }
        //将p的后续节点先保护起来,以便下一轮循环时确定起始位置
        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(); //打印输出,调试用  
        //重新将p定位到下一轮循环的"正确"起始节点
        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>

运行结果如下:

--排序前---

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程序设计有所帮助。

Javascript 相关文章推荐
有一段有意思的代码-javascript现实多行信息
Aug 26 Javascript
用js生产批量批处理执行命令
Jul 28 Javascript
javascript vvorld 在线加密破解方法
Nov 13 Javascript
修复IE9&amp;safari 的sort方法
Oct 21 Javascript
关于div自适应高度/左右高度自适应一致的js代码
Mar 22 Javascript
jQuery中unwrap()方法用法实例
Jan 16 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
Jan 25 Javascript
Javascript 实现放大镜效果实例详解
Dec 03 Javascript
Angular简单验证功能示例
Dec 22 Javascript
在vue中使用Autoprefixed的方法
Jul 27 Javascript
ES6的Fetch异步请求的实现方法
Dec 07 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
Apr 01 Javascript
js获取图片宽高的方法
Nov 25 #Javascript
javascript数据结构之二叉搜索树实现方法
Nov 25 #Javascript
javascript常用经典算法实例详解
Nov 25 #Javascript
javascript实现很浪漫的气泡冒出特效
Sep 05 #Javascript
jQuery插件jquery-barcode实现条码打印的方法
Nov 25 #Javascript
JavaScript编写简单的计算器
Nov 25 #Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
Nov 25 #Javascript
You might like
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
基于php编程规范(详解)
2017/08/17 PHP
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
Javascript 类与静态类的实现(续)
2010/04/02 Javascript
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
2013/12/30 Javascript
jquery原创弹出层折叠效果点击折叠弹出一个层
2014/03/12 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
详解angular2封装material2对话框组件
2017/03/03 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
python实现查询苹果手机维修进度
2015/03/16 Python
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
对pyqt5之menu和action的使用详解
2019/06/20 Python
Python内置加密模块用法解析
2019/11/25 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
日本高岛屋百货购物网站:TAKASHIMAYA
2019/03/24 全球购物
商务日语毕业生自荐信
2013/11/23 职场文书
咨询公司各岗位职责
2013/12/02 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
亮剑精神演讲稿
2014/05/23 职场文书
企业授权委托书范本
2014/09/22 职场文书
会计出纳岗位职责
2015/03/31 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书
python_tkinter事件类型详情
2022/03/20 Python