关于线性存储的结构,大家常提到的就是数组,然而数组虽然索引快,但是其中的插入删除操作依然比较复杂,尤其是对有序数组的操作,因而还有另一种结构,那就是链表。
关于链表的构造,大家都应该比较清楚了,我们可以使用数组去模拟链表,叫做静态链表,我们也可以用C中的结构和指针来实现链表,也可以用C++/C#中类的结构来实现一个动态链表。在C#中,我们常提到的ArrayList就是基于链表实现的(每一个节点存储数据为object类型)。
关于C#的内置链表,主要是两个类:在命名空间System.Collections.Generic中的LinkedList和LinkedListNode。下面简单介绍用这两个内置的类如何构建链表:
class Program
{
static void Main(string[] args)
{
//新建一个数据类型为string的值为Mike的节点
LinkedListNode<string> node = new LinkedListNode<string>("Mike");
//新建一个数据类型为string的默认链表
LinkedList<string> names = new LinkedList<string>();
//链表的头结点添加为node
names.AddFirst(node);
LinkedListNode<string> node1 = new LinkedListNode<string>("David")
;
//在node节点后添加node1节点
names.AddAfter(node, node1);
LinkedListNode<string> node2 = new LinkedListNode<string>("Raymond");
//在node1节点前添加node2节点
names.AddBefore(node1, node2);
LinkedListNode<string> aNode;
//让栈中的aNode节点去寻找David节点,找不到则为空
aNode = names.Find("David");
if(aNode != null)
{
aNode = names.First;
}
while (aNode != null)
{
WriteLine(aNode.Value);
aNode = aNode.Next;
}
WriteLine("===============");
LinkedListNode<string> node3 = new LinkedListNode<string>("Jacky");
LinkedListNode<string> node4 = new LinkedListNode<string>("Monkey");
//在头结点处添加节点node3
names.AddFirst(node3);
//在尾节点处添加节点node4
names.AddLast(node4);
//aNode指向node4节点所在的链表的第一个节点
aNode = node4.List.First;
while(aNode != null)
{
WriteLine(aNode.Value);
aNode = aNode.Next;
}
}
}
由此可以看出,LinkedList和LinkedListNode组成的是一个双向链表的结构,功能十分丰富,简单易用。