十一.链表
两种不同的实现:基于对象的链表、基于数组的链表
数组存在的问题
在无需数组中查找一个数据项是很慢的;有序(排序)数组对查找而言会更加高效,但是插入和删除操作还是很慢。
链表的定义
链表是被称为节点的类对象的群集。每个节点通过一个链接到列表内的后记节点。
节点包括存储数据的字段和节点引用的字段。节点引用的字段被称为是链接。
对链表结尾的标记,是通过指向空(null)值实现的。
插入操作:把要插入节点之前的链接改为指向要插入的节点,并把新节点的链接设为指向插入之前前节点所指向的节点。
移出操作:把要删除的节点之前节点的链接重新定向到删除节点所指向的节点,并把删除节点的连接设置为null。
面向对象链接的设计
节点是由两个数据成员组成:存储着节点的数据Element、指向表内下一节点引用的链接Link。
链表是多个节点之间的链接。这个链表类包括几种方法:把节点添加到链表的方法、从链表中移除节点的方法、遍历链表的方法、找到链表内节点的方法。还包括唯一的数据成员:头节点。
链表设计的改进方案:
双向链表
增加了一个指向前一个节点的链接。
循环链表
把尾节点指向首节点。
.NET框架库是用循环链表的设计来实现ArrayList数据结构的。
LinkedList类和LinkedListNode类
LinkedList表示一个双向链表。
LinkedListNode类则表示 LinkedList<T> 中的节点。
namespace System.Collections.Generic
// 摘要:
// 表示双向链表。
//
// 类型参数:
// T:
// 指定链表的元素类型。
public classLinkedList<T> : ICollection<T>,IEnumerable<T>,ICollection, IEnumerable,ISerializable,IDeserializationCallback
// 摘要:
// 表示System.Collections.Generic.LinkedList<T>中的节点。无法继承此类。
//
// 类型参数:
// T:
// 指定链表的元素类型。
[ComVisible(false)]
public sealed class LinkedListNode<T>
LinkedList常用成员
Count属性,获取LinkedList 中实际包含的节点数。
First属性,获取LinkedList 的第一个节点。
Last属性,获取LinkedList 的最后一个节点。
AddAfter方法,在 LinkedList 中的现有节点后添加新的节点或值。
AddBefore方法,在 LinkedList 中的现有节点前添加新的节点或值。
AddFirst方法,在 LinkedList 的开头处添加新的节点或值。
AddLast方法,在 LinkedList 的结尾处添加新的节点或值。
Clear方法,从 LinkedList 中移除所有节点。
Contains方法,确定某值是否在 LinkedList 中。
CopyTo 方法,从目标数组的指定索引处开始将整个 LinkedList 复制到兼容的一维Array。
Find方法,查找包含指定值的第一个节点。
FindLast方法,查找包含指定值的最后一个节点。
GetEnumerator方法,返回循环访问 LinkedList 的枚举数。
Remove方法,从 LinkedList 中移除节点或值的第一个匹配项。
RemoveFirst方法,移除位于 LinkedList 开头处的节点。
RemoveLast方法,移除位于 LinkedList 结尾处的节点。
LinkedListNode常用成员
List属性,获取LinkedListNode<T> 所属的LinkedList<T>。
Next属性,获取LinkedList<T> 中的下一个节点。
Previous 属性,获取LinkedList<T> 中的上一个节点。
Value属性,获取节点中包含的值。
LinkedList<int> ll =new LinkedList<int>();///双向链表
LinkedListNode<int> lln =new LinkedListNode<int>(12);
LinkedListNode<int> lln1 =new LinkedListNode<int>(22);
LinkedListNode<int> lln2 =new LinkedListNode<int>(32);
LinkedListNode<int> lln3 =new LinkedListNode<int>(42);
ll.AddFirst(lln);
ll.AddFirst(lln1);
ll.AddFirst(lln2);
ll.AddFirst(lln3);
ll.AddAfter(lln2, 2);
ll.AddLast(new LinkedListNode<int>(-2));
ll.AddLast(new LinkedListNode<int>(2));
ll.RemoveFirst();
ll.Remove(ll.Find(2));
LinkedListNode<int> oneNode =newLinkedListNode<int>(0);
///遍历
oneNode = ll.First;
while (oneNode != null)
{
Console.WriteLine(oneNode.Value);
oneNode = oneNode.Next;
}
///32
///22
///12
///-2
///2