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 相关文章推荐
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
Apr 08 Javascript
Javascript实现多彩雪花从天降散落效果的方法
Feb 02 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
Jan 08 Javascript
详解jQuery中的事件
Dec 14 Javascript
three.js快速入门【推荐】
Jan 21 Javascript
vue.js打包之后可能会遇到的坑!
Jun 03 Javascript
Vuex的初探与实战小结
Nov 26 Javascript
JS基于ES6新特性async await进行异步处理操作示例
Feb 02 Javascript
微信小程序登录session的使用
Mar 17 Javascript
js判断一个对象是数组(函数)的方法实例
Dec 19 Javascript
JavaScript逻辑运算符相关总结
Sep 04 Javascript
ant-design表单处理和常用方法及自定义验证操作
Oct 27 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
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
PHP提取中文首字母
2008/04/09 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
Python中scatter函数参数及用法详解
2017/11/08 Python
pandas修改DataFrame列名的方法
2018/04/08 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
python中时间、日期、时间戳的转换的实现方法
2019/07/06 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
python_mask_array的用法
2020/02/18 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
建筑安全责任书范本
2014/07/24 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
python本地文件服务器实例教程
2021/05/02 Python
排查MySQL生产环境索引没有效果
2022/04/11 MySQL