C#实现双向链表,此文根据http://blog.csdn.net/fenglibing/archive/2006/04/19/669456.aspx(JAVA双向链表修改而成)
public class DoubleLinkedList
{
// 节点类Node
private class Node
{
public Object value;
public Node prev = null;
public Node next = null;
public Node(Object v)
{
value = v;
prev = this;
next = this;
}
public String toString()
{
return value.ToString();
}
}
private Node head = new Node(null); // 头节点
private int size; // 链表大小
// 以下是接口方法
public bool AddFirst(Object o)
{
AddAfter(new Node(o), head);
return true;
}
public bool AddLast(Object o)
{
AddBefore(new Node(o), head);
return true;
}
public bool Add(Object o)
{
return AddLast(o);
}
public bool Add(int index, Object o)
{
AddBefore(new Node(o), GetNode(index));
return true;
}
public bool Remove(int index)
{
RemoveNode(GetNode(index));
return true;
}
public bool RemoveFirst()
{
RemoveNode(head.next);
return true;
}
public bool RemoveLast()
{
RemoveNode(head.prev);
return true;
}
public Object Get(int index)
{
return GetNode(index).value;
}
public int Size()
{
return size;
}
public override String ToString()
{
StringBuilder s = new StringBuilder("[");
Node node = head;
for (int i = 0; i < size; i++)
{
node = node.next;
if (i > 0)
s.Append(", ");
s.Append(node.value);
}
s.Append("]");
return s.ToString();
}
//以下是实现方法
private Node GetNode(int index)
{
if (index < 0 || index >= size)
throw new IndexOutOfRangeException();
Node node = head.next;
for (int i = 0; i < index; i++)
node = node.next;
return node;
}
private void AddBefore(Node newNode, Node node)
{
newNode.next = node;
newNode.prev = node.prev;
newNode.next.prev = newNode;
newNode.prev.next = newNode;
size++;
}
private void AddAfter(Node newNode, Node node)
{
newNode.prev = node;
newNode.next = node.next;
newNode.next.prev = newNode;
newNode.prev.next = newNode;
size++;
}
private void RemoveNode(Node node)
{
node.prev.next = node.next;
node.next.prev = node.prev;
node.prev = null;
node.next = null;
size--;
}
}
测试类如下:
class Program
{
static void Main(string[] args)
{
DoubleLinkedList dll = new DoubleLinkedList();
//添加
dll.Add("张曼玉");
dll.Add("钟楚红");
dll.Add("刘嘉玲");
Console.WriteLine(dll);
//添加到最前
dll.AddFirst("林青霞");
Console.WriteLine(dll);
//添加到最后,同添加
dll.AddLast("梅艳芳");
Console.WriteLine(dll);
//添加到指定位置
dll.Add(4, "王祖贤");
Console.WriteLine(dll);
//移除最前的
dll.RemoveFirst();
Console.WriteLine(dll);
//移除最后的
dll.RemoveLast();
Console.WriteLine(dll);
//移除指定位置上的
dll.Remove(2);
Console.WriteLine(dll);
//返回指定位置上的元素
Console.WriteLine(dll.Get(1));
Console.ReadLine();
}
}
输出:
[张曼玉, 钟楚红, 刘嘉玲]
[林青霞, 张曼玉, 钟楚红, 刘嘉玲]
[林青霞, 张曼玉, 钟楚红, 刘嘉玲, 梅艳芳]
[林青霞, 张曼玉, 钟楚红, 刘嘉玲, 王祖贤, 梅艳芳]
[张曼玉, 钟楚红, 刘嘉玲, 王祖贤, 梅艳芳]
[张曼玉, 钟楚红, 刘嘉玲, 王祖贤]
[张曼玉, 钟楚红, 王祖贤]
钟楚红