javascript链表类似java的List,
这是一个javascript实现的链表,功能与java中的list差不多,很简单也很好用。
/**
* 简单链表
* @return
*/
function CGLinkedList()
{
function Entry(next, data)
{
this.next = next
this.data = data
}
/**
* 内不类, 迭代器
* @param node
* @return
*/
function Iterator(node)
{
this.cousor = node
this.hasNext = function ()
{
return (this.cousor.next != null);
}
this.next = function ()
{
var rt = this.cousor.next
this.cousor = this.cousor.next
return rt.data
}
}
this.head = new Entry(null, null)
/**
* 列表节点个数
*/
this.size = function ()
{
var size = 0
if (this.head == null)
{
return size
}
var p = this.head.next
for(; p!=null; p = p.next)
size++;
return size;
}
this.clear = function ()
{
this.head = null
}
this.getNode = function (idx)
{
var pos = -1;
var p = this.head
while (p != null && pos < idx) {
p = p.next;
pos ++;
}
return p;
}
/**
* 返回指定索引出的节点对象
*/
this.get = function (idx)
{
return this.getNode(idx).data
}
/**
* 项列表添加一个元素
*/
this.add = function (data)
{
this.insert(this.size(), data)
}
/**
* 在指定索引出添加一个元素
*/
this.insert = function (idx, data)
{
var p = this.getNode(idx-1); /*注意查询idx-1*/
if (p == null){
return
}
var node = new Entry(p.next, data)
p.next = node
}
/**
* 删除指定位置处的元素
*/
this.remove = function (idx)
{
var prenode = this.getNode(idx - 1)
var node = this.getNode(idx)
if (prenode == null || node == null)
{
return null
}
prenode.next = node.next
return node.data
}
/**
* 迭代遍历器
*/
this.iterator = function ()
{
return new Iterator(this.head)
}
this.swap = function (a, b)
{
var av = this.getNode(a)
var bv = this.getNode(b)
var tmp = av.data
av.data = bv.data
bv.data = tmp
}
}
/*********************************************************************************************************************/