C#实现的内存单链表一例
/// <summary>
/// 定义:内存索引链表
/// vp:hsg
/// create date:2018-01
/// </summary>
public class BIndexLinkTable<V> : IDisposable
{
public BIndexLink<V> RootNode = null;
public BIndexLinkTable()
{
}
public void Dispose()
{
this.Clear();
}
public void Clear()
{
if (this.RootNode != null)
{
this.RootNode.Dispose();
this.RootNode = null;
GC.Collect();
}
}
public void Add(long Tkey, V value)
{
if (this.RootNode == null)
{
this.RootNode = new BIndexLink<V>(Tkey, value);
}
else
{
//添加到尾部
BIndexLink<V> tempNode = this.GetLastNode();
tempNode.NextNode = new BIndexLink<V>(Tkey, value);
}
}
//删除节点
public void deleteNode(long Tkey)
{
if (this.RootNode == null) return;
BIndexLink<V> tempNode = this.FindNode(Tkey);
if (tempNode != null)
{
this.deleteNode(tempNode);
}
}
//删除节点
public void deleteNode(BIndexLink<V> toBeDeleted)
{
if (toBeDeleted == null || this.RootNode == null) return;
if (toBeDeleted.NextNode != null)
{ //删除的是中间节点
BIndexLink<V> temp = toBeDeleted.NextNode;
toBeDeleted.Value = temp.Value;
toBeDeleted.NextNode = temp.NextNode;
}
else
{
BIndexLink<V> temp = this.RootNode;
while (temp.NextNode != toBeDeleted)
{
temp = temp.NextNode;
}
temp.NextNode = null;
}
}
public V this[long Tkey]
{
get
{
if (this.RootNode != null)
{
BIndexLink<V> tempNode = this.FindNode(Tkey);
if (tempNode != null)
{
return tempNode.Value;
}
}
return default(V);
}
set
{
this.Add(Tkey, value);
}
}
//=========================
//查找节点
public BIndexLink<V> FindNode(long Tkey)
{
BIndexLink<V> tempNode = this.RootNode;
while (tempNode != null)
{
if (tempNode.Key == Tkey)
{
return tempNode;
}
tempNode = tempNode.NextNode;
}
return null;
}
//查找最后节点
public BIndexLink<V> GetLastNode()
{
BIndexLink<V> tempNode = this.RootNode;
while (tempNode.NextNode != null)
{
tempNode = tempNode.NextNode;
}
return tempNode;
}
//是否包含Key
public bool ContainsKey(long Tkey)
{
BIndexLink<V> tempNode = this.RootNode;
while (tempNode != null)
{
if (tempNode.Key == Tkey)
{
return true;
}
tempNode = tempNode.NextNode;
}
return false;
}
//=========================
}
//内存索引节点
public class BIndexLink<V>:IDisposable
{
public long Key = -1;
public V Value = default(V);
//
public BIndexLink<V> NextNode=null;
public BIndexLink(long Tkey, V Value)
{
this.Key = Tkey;
this.Value = Value;
}
public virtual void Dispose()
{
}
}