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中的事件代理初探
Mar 08 Javascript
jQuery EasyUI datagrid实现本地分页的方法
Feb 13 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
Mar 06 Javascript
js实现带圆角的两级导航菜单效果代码
Aug 24 Javascript
JS原型对象的创建方法详解
Jun 16 Javascript
利用Angularjs和Bootstrap前端开发案例实战
Aug 27 Javascript
基于JavaScript实现窗口拖动效果
Jan 18 Javascript
JavaScript中关于base64的一些事
May 06 Javascript
layui的select联动实现代码
Sep 28 Javascript
JS脚本实现定时到网站上签到/签退功能
Apr 22 Javascript
JavaScript基于用户照片姓名生成海报
May 29 Javascript
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
Mar 17 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
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
AM/FM收音机的安装与调试
2021/03/02 无线电
php查找任何页面上的所有链接的方法
2013/12/03 PHP
CI框架中libraries,helpers,hooks文件夹详细说明
2014/06/10 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
ES6 十大特性简介
2020/12/09 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
深入理解Python分布式爬虫原理
2017/11/23 Python
Django添加sitemap的方法示例
2018/08/06 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python操作gitlab API过程解析
2019/12/27 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
竞聘演讲稿开场白
2014/08/25 职场文书
少先队活动总结
2014/08/29 职场文书
南京市纪委监察局整改方案
2014/09/16 职场文书
2015年小学语文教师工作总结
2015/10/23 职场文书
简短清晨问候语
2015/11/10 职场文书
浅谈MySQL函数
2021/10/05 MySQL