栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > Web开发 > JavaScript

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

JavaScript 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

复制代码 代码如下:
function linkNode(_key, _value)
{
    ///


    /// 链表类的节点类
    ///

    this.Key = _key;
    this.Value = _value;
    this.next = null;
}
function link()
{
    ///
    /// 创建一个链表类
    ///

    this.root = new linkNode(null, null); //root永远是个空节点
    this.end = this.root;
}
link.prototype =
{
    count: 0,
    value: function (_key)
    {
        ///
        /// 根据key的值来获取value值
        ///

        ///
        /// key的值
        ///
        ///
        /// 对应的value的值
        ///

        var i = this.root;
        while (Boolean(i = i.next))
        {
            if (i.Key == _key)
                return i.Value;
        }
    },
    add: function (_key, _value)
    {
        ///
        /// 往链表的尾部中加入一个节点
        ///

        ///
        /// key的值
        ///
        ///
        /// value的值
        ///
        ///
        /// 返回新增加的value的值
        ///

        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)
    {
        ///
        /// 从链表类的某节点之后插入新节点node.
        ///

        ///
        /// 在键值等于_key的元素之后插入
        ///
        ///
        /// 要插入的元素
        ///
        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)
    {
        ///
        /// 从链表类的某节点之后插入新节点node.
        ///

        ///
        /// 在键值等于_key的元素之后插入
        ///
        ///
        /// 要插入的元素 www.jb51.net
        ///
        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)
    {
        ///
        /// 从链表类中移除一个key
        ///

        ///
        /// key的值
        ///
        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)
    {
        ///


        /// 检查链表类中是否存在一个key
        ///

        ///
        /// key的值
        ///
        ///
        ///

        var i = this.root;
        while (Boolean(i = i.next))
            if (i.Key == _key)
                return true;
        return false;
    },
    removeAll: function ()
    {
        ///
        /// 清空链表类
        ///

        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 ()
    {
        ///
        /// 转换成JSON字符串
        ///

        ///
        ///

        //内部方法,用于递归
        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 ()
    {
        ///
        /// 转所有节点的value换成JSON字符串,数组格式
        ///

        ///
        ///

        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)
    {
        ///
        /// 对链表进行排序
        ///

        ///
        /// 比较两个链表元素大小的方法,当返回真时,此方法的参数所指的节点将往下沉
        ///
        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
        {

        }
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/111091.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号