js单向链表的具体实现实例
js单向链表的具体实现实例
发布时间:2016-12-30 来源:查字典编辑
摘要:复制代码代码如下:functionlinkNode(_key,_value){//////链表类的节点类///this.Key=_key;t...

复制代码 代码如下:

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">

/// 要插入的元素 www.jb51.net

/// </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教程学习
编程开发子分类