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 相关文章推荐
ExtJS GTGrid 简单用户管理
Jul 01 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
Jul 28 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
Dec 02 Javascript
浅析JS运动
Dec 28 Javascript
JavaScript SHA-256加密算法详细代码
Oct 06 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
Nov 21 Javascript
AngularJS路由切换实现方法分析
Mar 17 Javascript
JS实现的汉字与Unicode码相互转化功能分析
May 25 Javascript
给localStorage设置一个过期时间的方法分享
Nov 06 Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 Javascript
微信小程序实现自定义底部导航
Nov 18 Javascript
微前端qiankun改造日渐庞大的项目教程
Jun 21 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
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
PHP中把stdClass Object转array的几个方法
2014/05/08 PHP
php中异常处理方法小结
2015/01/09 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
javascript得到XML某节点的子节点个数的脚本
2008/10/11 Javascript
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
JSON为什么那样红为什么要用json(另有洞天)
2012/12/26 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
vue中接口域名配置为全局变量的实现方法
2018/09/20 Javascript
nodejs实现日志读取、日志查找及日志刷新的方法分析
2019/05/20 NodeJs
JS实现滑动导航效果
2020/01/14 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
2020/06/19 Javascript
antd design table更改某行数据的样式操作
2020/10/31 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
[03:28]2014DOTA2国际邀请赛 走近EG战队天才中单Arteezy
2014/07/12 DOTA
实例讲解Python中函数的调用与定义
2016/03/14 Python
Python创建xml文件示例
2017/03/22 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
Python 函数返回值的示例代码
2019/03/11 Python
python Jupyter运行时间实例过程解析
2019/12/13 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
女方婚礼新郎答谢词
2014/01/11 职场文书
生日邀请函范文
2014/01/13 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
银行党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
公司合作协议范文
2014/10/01 职场文书
文艺晚会开场白
2015/05/29 职场文书