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 相关文章推荐
某人初学javascript的时候写的学习笔记
Dec 30 Javascript
js中有关IE版本检测
Jan 04 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
Mar 01 Javascript
javascript动态加载实现方法一
Aug 22 Javascript
js闭包实现按秒计数
Apr 23 Javascript
整理Javascript基础入门学习笔记
Nov 29 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
Jan 03 Javascript
BootStrap Fileinput初始化时的一些参数
Dec 30 Javascript
Swiper自定义分页器使用详解
Dec 28 Javascript
Mint UI实现A-Z字母排序的城市选择列表
Dec 28 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
May 15 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
Jul 28 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
免费的ip数据库淘宝IP地址库简介和PHP调用实例
2014/04/08 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
2009/10/20 Javascript
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
2011/07/04 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python3写入文件常用方法实例分析
2015/05/22 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
三爱活动实施方案
2014/03/19 职场文书
艺术教育实施方案
2014/05/03 职场文书
医院信息公开实施方案
2014/05/09 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
李培根演讲稿
2014/05/22 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
2014年销售员工作总结
2014/12/01 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
关于感恩的素材句子(38句)
2019/11/11 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
Python天气语音播报小助手
2021/09/25 Python
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL