概述
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.uoften.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
{
}
}
};
最后
以上就是优雅水蜜桃为你收集整理的js单向链表的具体实现实例的全部内容,希望文章能够帮你解决js单向链表的具体实现实例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复