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

  

复制代码 代码如下:

  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.glzy8.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

  {

  }

  }

  };