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 { } } };
js单向链表的具体实现实例
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@