js单向链表的具体实现实例


Posted in Javascript onJune 21, 2013
function linkNode(_key, _value)
{
    /// <summary>
    /// 链表类的节点类
    /// </summary>
    this.Key = _key;
    this.Value = _value;
    this.next = null;
}
function Link()
{
    /// <summary>
    /// 创建一个链表类
    /// </summary>
    this.root = new linkNode(null, null); //root永远是个空节点
    this.end = this.root;
}
Link.prototype =
{
    count: 0,
    value: function (_key)
    {
        /// <summary>
        /// 根据key的值来获取value值
        /// </summary>
        /// <param name="_key" type="String">
        /// key的值
        /// </param>
        /// <returns type="Object">
        /// 对应的value的值
        /// </returns>
        var i = this.root;
        while (Boolean(i = i.next))
        {
            if (i.Key == _key)
                return i.Value;
        }
    },
    add: function (_key, _value)
    {
        /// <summary>
        /// 往链表的尾部中加入一个节点
        /// </summary>
        /// <param name="_key" type="String">
        /// key的值
        /// </param>
        /// <param name="_value" type="Object">
        /// value的值
        /// </param>
        /// <returns type="Object">
        /// 返回新增加的value的值
        /// </returns>
        var i = this.root;
        while (Boolean(i = i.next))
        {
            if (i.Key == _key)
                return i.Value = _value;
        }
        var node = new linkNode(_key, _value);
        if (this.count == 0)
            this.root.next = node;
        else
            this.end.next = node;
        this.end = node;
        this.count++;
        return _value;
    },
    insert: function (_key, node)
    {
        /// <summary>
        /// 从链表类的某节点之后插入新节点node.
        /// </summary>
        /// <param name="_key" type="String">
        /// 在键值等于_key的元素之后插入
        /// </param>
        /// <param name="node" type="Object">
        /// 要插入的元素
        /// </param>
        var i = this.root;
        while (Boolean(i = i.next))
        {
            if (i.Key == _key)
            {
                var tmp = i.next;
                i.next = node;
                node.next = tmp;
                break;
            }
        }
    },
    insertBefore: function (_key, node)
    {
        /// <summary>
        /// 从链表类的某节点之后插入新节点node.
        /// </summary>
        /// <param name="_key" type="String">
        /// 在键值等于_key的元素之后插入
        /// </param>
        /// <param name="node" type="Object">
        /// 要插入的元素 3water.com
        /// </param>
        var i = this.root;
        while (Boolean(i = i.next))
        {
            if (i.next.Key == _key)
            {
                var tmp = i.next;
                i.next = node;
                node.next = tmp;
                break;
            }
        }
    },
    remove: function (_key)
    {
        /// <summary>
        /// 从链表类中移除一个key
        /// </summary>
        /// <param name="_key" type="String">
        /// key的值
        /// </param>
        var i = this.root;
        do
        {
            if (i.next.Key == _key)
            {
                if (i.next.next == null)
                    this.end = i;
                i.next = i.next.next;
                this.count--;
                return;
            }
        } while (Boolean(i = i.next))
    },
    exists: function (_key)
    {
        /// <summary>
        /// 检查链表类中是否存在一个key
        /// </summary>
        /// <param name="_key" type="String">
        /// key的值
        /// </param>
        /// <returns type="Boolean">
        /// </returns>
        var i = this.root;
        while (Boolean(i = i.next))
            if (i.Key == _key)
                return true;
        return false;
    },
    removeAll: function ()
    {
        /// <summary>
        /// 清空链表类
        /// </summary>
        this.root = new linkNode(null, null);
        this.end = this.root;
        this.count = 0;
    },
    Obj2str: function (o)
    {
        if (o == undefined)
        {
            return "";
        }
        var r = [];
        if (typeof o == "string")
            return "\"" + o.replace(/([\"\\])/g, "\\$1").replace(/(\n)/g, "\\n").replace(/(\r)/g, "\\r").replace(/(\t)/g, "\\t") + "\"";
        if (typeof o == "object")
        {
            if (!o.sort)
            {
                for (var i in o)
                    r.push("\"" + i + "\":" + this.Obj2str(o[i]));
                r = "{" + r.join() + "}";
            }
            else
            {
                for (var i = 0; i < o.length; i++)
                    r.push(this.Obj2str(o[i]))
                r = "[" + r.join() + "]";
            }
            return r;
        }
        return o.toString().replace(/\"\:/g, '":""');
    },
    getJSON: function ()
    {
        /// <summary>
        /// 转换成JSON字符串
        /// </summary>
        /// <returns type="String">
        /// </returns>
        //内部方法,用于递归
        var me = this;
        var getChild = function (node)
        {
            var str = "";
            str += "{\"Key\":\"" + node.Key + "\",\"Value\":" + me.Obj2str(node.Value);
            if (node.next != null)
                str += ",\"next\":" + getChild(node.next);
            else
                str += ",\"next\":\"null\"";
            str += "}";
            return str;
        };
        var link = "{\"root\":{\"Key\":\"null\",\"Value\":\"null\",\"next\":";
        if (this.count == 0)//如果空表
        {
            return "{\"root\":{\"Key\":\"null\",\"Value\":\"null\",\"next\":\"null\"},\"end\":{\"Key\":\"null\",\"Value\":\"null\",\"next\":\"null\"},\"count\":\"0\"}";
        }
        link += getChild(this.root.next) + "}";
        //加上end
        link += ",\"end\":{\"Key\":\"" + this.end.Key + "\",\"Value\":" + me.Obj2str(this.end.Value) + ",\"next\":\"null\"";
        link += "},\"count\":\"" + this.count + "\"}";
        return link;
    },
    getArrayJSON: function ()
    {
        /// <summary>
        /// 转所有节点的value换成JSON字符串,数组格式
        /// </summary>
        /// <returns type="String">
        /// </returns>
        var link = "{\"link\":[";
        var i = this.root;
        while (Boolean(i = i.next))
        {
            link += this.Obj2str(i.Value) + ",";
        }
        link = link.substr(0, link.length - 1);
        link += "]}";
        return link;
    },
    sort: function (fn)
    {
        /// <summary>
        /// 对链表进行排序
        /// </summary>
        /// <param name="fn" type="Function">
        /// 比较两个链表元素大小的方法,当返回真时,此方法的参数所指的节点将往下沉
        /// </param>
        if (fn != null)
        {
            var i = this.root;
            while (Boolean(i = i.next))
            {
                var j = this.root;
                while (Boolean(j = j.next))
                {
                    if (j.next != null)
                    {
                        if (fn.call(this, j))
                        {
                            var Key = j.Key;
                            var Value = j.Value;
                            j.Key = j.next.Key;
                            j.Value = j.next.Value;
                            j.next.Key = Key;
                            j.next.Value = Value;
                        }
                    }
                }
                this.end = i;
            }
        }
        else
        {
        }
    }
};
Javascript 相关文章推荐
清空上传控件input file的值
Jul 03 Javascript
jquery实现动态画圆
Dec 04 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
Aug 02 Javascript
AngularJS应用开发思维之依赖注入3
Aug 19 Javascript
JS实现六位字符密码输入器功能
Aug 19 Javascript
JS使用正则实现去掉字符串左右空格的方法
Dec 27 Javascript
轻松理解JavaScript闭包
Mar 14 Javascript
jqueryUI tab标签页代码分享
Oct 09 jQuery
Angular2 父子组件通信方式的示例
Jan 29 Javascript
基于Fixed定位的框选功能的实现代码
May 13 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
Nov 23 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
Jan 16 Javascript
javascript setTimeout和setInterval计时的区别详解
Jun 21 #Javascript
js简易namespace管理器 实例代码
Jun 21 #Javascript
JavaScript中的this关键字介绍与使用实例
Jun 21 #Javascript
js验证模型自我实现的具体方法
Jun 21 #Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
Jun 21 #Javascript
无缝滚动js代码通俗易懂(自写)
Jun 19 #Javascript
HTML5之lang属性与dir属性的详解
Jun 19 #Javascript
You might like
《APMServ 5.1.2》使用图解
2006/10/23 PHP
PHP静态类
2006/11/25 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
比较详细PHP生成静态页面教程
2012/01/10 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
jquery创建一个ajax关键词数据搜索实现思路
2013/02/26 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
html+javascript+bootstrap实现层级多选框全层全选和多选功能
2017/03/09 Javascript
vue脚手架中配置Sass的方法
2018/01/04 Javascript
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
JavaScript闭包相关知识解析
2019/10/19 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
python冒泡排序算法的实现代码
2013/11/21 Python
python抓取百度首页的方法
2015/05/19 Python
Python登录系统界面实现详解
2019/06/25 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
python logging.info在终端没输出的解决
2020/05/12 Python
浅析python函数式编程
2020/09/26 Python
迟到检讨书大全
2014/01/25 职场文书
关于热爱祖国的演讲稿
2014/05/04 职场文书
财务部绩效考核方案
2014/05/04 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
2015年学校精神文明工作总结
2015/05/27 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers