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 相关文章推荐
用js来解决ajax读取页面乱码
Nov 28 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
Apr 07 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
Feb 12 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
Jun 15 Javascript
JavaScript利用append添加元素报错的解决方法
Jul 01 Javascript
通过JS动态创建一个html DOM元素并显示
Oct 15 Javascript
JavaScript必知必会(七)js对象继承
Jun 08 Javascript
JS简单实现获取元素的封装操作示例
Apr 07 Javascript
vue中用H5实现文件上传的方法实例代码
May 27 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
Jan 27 Javascript
详解es6新增数组方法简便了哪些操作
May 09 Javascript
JavaScript冒泡算法原理与实现方法深入理解
Jun 04 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
php中的常用魔术方法汇总
2016/02/14 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
JavaScript的面向对象(二)
2006/11/09 Javascript
js 调用本地exe的例子(支持IE内核的浏览器)
2012/12/26 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
动态加载js、css的简单实现代码
2016/05/26 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
VsCode插件整理(小结)
2017/09/14 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
整理Python 常用string函数(收藏)
2016/05/30 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
2020/09/05 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
魅力教师事迹材料
2014/01/10 职场文书
医校毕业生自我鉴定
2014/01/25 职场文书
参观接待方案
2014/03/17 职场文书
社区禁毒工作方案
2014/06/02 职场文书
2014年英语工作总结
2014/12/20 职场文书
中秋客户感谢信
2015/01/22 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python