C#链表
一、基本概念
链表在很多语言中都有介绍,它是一种链状的数据结构。它本身带有的节点可以指向下一个或上一个节点,从而可实现轮询。
二、链表的优缺点
优点:
一般数组都是需要一连串的内存空间来存储数据,但是链表结构不需要一连串的内存空间。此外,由于他具有的独特的结构,使得链表插入数据变得非常的快捷。因为它不需要移动后面的数据。List列表中间插入一个数据时,后面所有的数据都要进行移动。
缺点:
但是链表也有缺点,因为每个节点都是离散的,所以访问链表中数据只能一个接着一个访问,这需要较长的时间来查找位于链表中间或尾部的元素。访问数据效率就会变得低下。
三、LinkedList<T>
是一个双向的链表,其元素指定前面和后面的元素。
public class LinkedList : ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback
{ 类体。。。}
上述可知,LinkedList<T>继承了ICollection, IEnumerable<T>, ICollection, IEnumerable, ISerializable, IDeserializationCallback接口。
四、LinkedList<T>链表常用的方法
// 摘要:
// 初始化为空的 System.Collections.Generic.LinkedList<T> 类的新实例。
public LinkedList();
//
// 摘要:
// 初始化 System.Collections.Generic.LinkedList<T> 类的新实例,该实例包含从指定的 System.Collections.IEnumerable
// 中复制的元素并且其容量足以容纳所复制的元素数。
//
// 参数:
// collection:
// System.Collections.IEnumerable,其元素被复制到新的 System.Collections.Generic.LinkedList<T>
// 中。
//
// 异常:
// System.ArgumentNullException:
// collection 为 null。
public LinkedList(IEnumerable<T> collection);
//
// 摘要:
// 初始化 System.Collections.Generic.LinkedList<T> 类的新实例,该实例可使用指定的 System.Runtime.Serialization.SerializationInfo
// 和 System.Runtime.Serialization.StreamingContext 进行序列化。
//
// 参数:
// info:
// 一个 System.Runtime.Serialization.SerializationInfo 对象,它包含序列化 System.Collections.Generic.LinkedList<T>
// 所需的信息。
//
// context:
// System.Runtime.Serialization.StreamingContext 对象,该对象包含与 System.Collections.Generic.LinkedList<T>
// 相关联的序列化流的源和目标。
protected LinkedList(SerializationInfo info, StreamingContext context);
// 摘要:
// 获取 System.Collections.Generic.LinkedList<T> 中实际包含的节点数。
//
// 返回结果:
// System.Collections.Generic.LinkedList<T> 中实际包含的节点数。
public int Count { get; }
//
// 摘要:
// 获取 System.Collections.Generic.LinkedList<T> 的第一个节点。
//
// 返回结果:
// System.Collections.Generic.LinkedList<T> 的第一个 System.Collections.Generic.LinkedListNode<T>。
public LinkedListNode<T> First { get; }
//
// 摘要:
// 获取 System.Collections.Generic.LinkedList<T> 的最后一个节点。
//
// 返回结果:
// System.Collections.Generic.LinkedList<T> 的最后一个 System.Collections.Generic.LinkedListNode<T>。
public LinkedListNode<T> Last { get; }
// 摘要:
// 在 System.Collections.Generic.LinkedList<T> 中指定的现有节点后添加指定的新节点。
//
// 参数:
// node:
// 要在其后插入 newNode 的 System.Collections.Generic.LinkedListNode<T>。
//
// newNode:
// 要添加到 System.Collections.Generic.LinkedList<T> 的新 System.Collections.Generic.LinkedListNode<T>。
//
// 异常:
// System.ArgumentNullException:
// node 为 null。 - 或 - newNode 为 null。
//
// System.InvalidOperationException:
// node 不在当前 System.Collections.Generic.LinkedList<T> 中。 - 或 - newNode 属于另一个
// System.Collections.Generic.LinkedList<T>。
public void AddAfter(LinkedListNode<T> node, LinkedListNode<T> newNode);
//
// 摘要:
// 在 System.Collections.Generic.LinkedList<T> 中指定的现有节点后添加包含指定值的新节点。
//
// 参数:
// node:
// 要在其后插入包含 value 的新 System.Collections.Generic.LinkedListNode<T> 的 System.Collections.Generic.LinkedListNode<T>。
//
// value:
// 要添加到 System.Collections.Generic.LinkedList<T> 的值。
//
// 返回结果:
// 包含 value 的新 System.Collections.Generic.LinkedListNode<T>。
//
// 异常:
// System.ArgumentNullException:
// node 为 null。
//
// System.InvalidOperationException:
// node 不在当前 System.Collections.Generic.LinkedList<T> 中。
public LinkedListNode<T> AddAfter(LinkedListNode<T> node, T value);
//
// 摘要:
// 在 System.Collections.Generic.LinkedList<T> 中指定的现有节点前添加指定的新节点。
//
// 参数:
// node:
// 要在其前插入 newNode 的 System.Collections.Generic.LinkedListNode<T>。
//
// newNode:
// 要添加到 System.Collections.Generic.LinkedList<T> 的新 System.Collections.Generic.LinkedListNode<T>。
//
// 异常:
// System.ArgumentNullException:
// node 为 null。 - 或 - newNode 为 null。
//
// System.InvalidOperationException:
// node 不在当前 System.Collections.Generic.LinkedList<T> 中。 - 或 - newNode 属于另一个
// System.Collections.Generic.LinkedList<T>。
public void AddBefore(LinkedListNode<T> node, LinkedListNode<T> newNode);
//
// 摘要:
// 在 System.Collections.Generic.LinkedList<T> 中指定的现有节点前添加包含指定值的新节点。
//
// 参数:
// node:
// 要在其前插入包含 value 的新 System.Collections.Generic.LinkedListNode<T> 的 System.Collections.Generic.LinkedListNode<T>。
//
// value:
// 要添加到 System.Collections.Generic.LinkedList<T> 的值。
//
// 返回结果:
// 包含 value 的新 System.Collections.Generic.LinkedListNode<T>。
//
// 异常:
// System.ArgumentNullException:
// node 为 null。
//
// System.InvalidOperationException:
// node 不在当前 System.Collections.Generic.LinkedList<T> 中。
public LinkedListNode<T> AddBefore(LinkedListNode<T> node, T value);
//
// 摘要:
// 在 System.Collections.Generic.LinkedList<T> 的开头处添加指定的新节点。
//
// 参数:
// node:
// 要在 System.Collections.Generic.LinkedList<T> 的开头处添加的新 System.Collections.Generic.LinkedListNode<T>。
//
// 异常:
// System.ArgumentNullException:
// node 为 null。
//
// System.InvalidOperationException:
// node 属于另一个 System.Collections.Generic.LinkedList<T>。
public void AddFirst(LinkedListNode<T> node);
//
// 摘要:
// 在 System.Collections.Generic.LinkedList<T> 的开头处添加包含指定值的新节点。
//
// 参数:
// value:
// 要在 System.Collections.Generic.LinkedList<T> 的开头处添加的值。
//
// 返回结果:
// 包含 value 的新 System.Collections.Generic.LinkedListNode<T>。
public LinkedListNode<T> AddFirst(T value);
//
// 摘要:
// 在 System.Collections.Generic.LinkedList<T> 的结尾处添加指定的新节点。
//
// 参数:
// node:
// 要添加至 System.Collections.Generic.LinkedList<T> 结尾的新 System.Collections.Generic.LinkedListNode<T>。
//
// 异常:
// System.ArgumentNullException:
// node 为 null。
//
// System.InvalidOperationException:
// node 属于另一个 System.Collections.Generic.LinkedList<T>。
public void AddLast(LinkedListNode<T> node);
//
// 摘要:
// 在 System.Collections.Generic.LinkedList<T> 的结尾处添加包含指定值的新节点。
//
// 参数:
// value:
// 要添加到 System.Collections.Generic.LinkedList<T> 的末尾的值。
//
// 返回结果:
// 包含 value 的新 System.Collections.Generic.LinkedListNode<T>。
public LinkedListNode<T> AddLast(T value);
//
// 摘要:
// 从 System.Collections.Generic.LinkedList<T> 中移除所有节点。
public void Clear();
//
// 摘要:
// 确定某值是否在 System.Collections.Generic.LinkedList<T> 中。
//
// 参数:
// value:
// 要在 System.Collections.Generic.LinkedList<T> 中定位的值。 对于引用类型,该值可以为 null。
//
// 返回结果:
// 如果在 System.Collections.Generic.LinkedList<T> 中找到 value,则为 true;否则为 false。
public bool Contains(T value);
//
// 摘要:
// 从目标数组的指定索引处开始将整个 System.Collections.Generic.LinkedList<T> 复制到兼容的一维 System.Array。
//
// 参数:
// array:
// 作为从 System.Collections.Generic.LinkedList<T> 复制的元素的目标位置的一维 System.Array。
// System.Array 必须具有从零开始的索引。
//
// index:
// array 中从零开始的索引,从此索引处开始进行复制。
//
// 异常:
// System.ArgumentNullException:
// array 为 null。
//
// System.ArgumentOutOfRangeException:
// index 小于零。
//
// System.ArgumentException:
// 源 System.Collections.Generic.LinkedList<T> 中的元素数目大于从 index 到目标 array 末尾之间的可用空间。
public void CopyTo(T[] array, int index);
//
// 摘要:
// 查找包含指定值的第一个节点。
//
// 参数:
// value:
// 要在 System.Collections.Generic.LinkedList<T> 中定位的值。
//
// 返回结果:
// 如果找到,则为包含指定值的第一个 System.Collections.Generic.LinkedListNode<T>;否则为 null。
public LinkedListNode<T> Find(T value);
//
// 摘要:
// 查找包含指定值的最后一个节点。
//
// 参数:
// value:
// 要在 System.Collections.Generic.LinkedList<T> 中定位的值。
//
// 返回结果:
// 如果找到,则为包含指定值的最后一个 System.Collections.Generic.LinkedListNode<T>;否则为 null。
public LinkedListNode<T> FindLast(T value);
//
// 摘要:
// 返回循环访问 System.Collections.Generic.LinkedList<T> 的枚举数。
//
// 返回结果:
// 用于 System.Collections.Generic.LinkedList<T> 的 System.Collections.Generic.LinkedList<T>.Enumerator。
public LinkedList<T>.Enumerator GetEnumerator();
//
// 摘要:
// 实现 System.Runtime.Serialization.ISerializable 接口,并返回序列化 System.Collections.Generic.LinkedList<T>
// 实例所需的数据。
//
// 参数:
// info:
// System.Runtime.Serialization.SerializationInfo 对象,该对象包含序列化 System.Collections.Generic.LinkedList<T>
// 实例所需的信息。
//
// context:
// System.Runtime.Serialization.StreamingContext 对象,该对象包含与 System.Collections.Generic.LinkedList<T>
// 实例关联的序列化流的源和目标。
//
// 异常:
// System.ArgumentNullException:
// info 为 null。
public virtual void GetObjectData(SerializationInfo info, StreamingContext context);
//
// 摘要:
// 实现 System.Runtime.Serialization.ISerializable 接口,并在完成反序列化之后引发反序列化事件。
//
// 参数:
// sender:
// 反序列化事件源。
//
// 异常:
// System.Runtime.Serialization.SerializationException:
// 与当前 System.Collections.Generic.LinkedList<T> 实例关联的 System.Runtime.Serialization.SerializationInfo
// 对象无效。
public virtual void OnDeserialization(object sender);
//
// 摘要:
// 从 System.Collections.Generic.LinkedList<T> 中移除指定的节点。
//
// 参数:
// node:
// 要从 System.Collections.Generic.LinkedList<T> 移除的 System.Collections.Generic.LinkedListNode<T>。
//
// 异常:
// System.ArgumentNullException:
// node 为 null。
//
// System.InvalidOperationException:
// node 不在当前 System.Collections.Generic.LinkedList<T> 中。
public void Remove(LinkedListNode<T> node);
//
// 摘要:
// 从 System.Collections.Generic.LinkedList<T> 中移除指定值的第一个匹配项。
//
// 参数:
// value:
// 要从 System.Collections.Generic.LinkedList<T> 中移除的值。
//
// 返回结果:
// 如果成功移除包含 value 的元素,则为 true;否则为 false。 如果在原始 System.Collections.Generic.LinkedList<T>
// 中没有找到 value,此方法也会返回 false。
public bool Remove(T value);
//
// 摘要:
// 移除位于 System.Collections.Generic.LinkedList<T> 开头处的节点。
//
// 异常:
// System.InvalidOperationException:
// System.Collections.Generic.LinkedList<T> 为空。
public void RemoveFirst();
//
// 摘要:
// 移除位于 System.Collections.Generic.LinkedList<T> 结尾处的节点。
//
// 异常:
// System.InvalidOperationException:
// System.Collections.Generic.LinkedList<T> 为空。
public void RemoveLast();
五、LinkedListNode<T>
链表是有节点组成的,每个节点包含自身的值、上一个节点和下一个节点的位置。链表节点的类就是LinkedListNode<T>。
LinkedListNode<T>的具体详细如下:
// 摘要:
// 表示 System.Collections.Generic.LinkedList<T> 中的节点。 此类不能被继承。
//
// 类型参数:
// T:
// 指定链表的元素类型。
[ComVisible(false)]
public sealed class LinkedListNode<T>
{
// 摘要:
// 初始化 System.Collections.Generic.LinkedListNode<T> 类的新实例,该实例包含指定的值。
//
// 参数:
// value:
// 要在 System.Collections.Generic.LinkedListNode<T> 中包含的值。
public LinkedListNode(T value);
// 摘要:
// 获取 System.Collections.Generic.LinkedListNode<T> 所属的 System.Collections.Generic.LinkedList<T>。
//
// 返回结果:
// 对 System.Collections.Generic.LinkedListNode<T> 所属的 System.Collections.Generic.LinkedList<T>
// 的引用;或者如果 System.Collections.Generic.LinkedListNode<T> 未链接,则为 null。
public LinkedList<T> List { get; }
//
// 摘要:
// 获取 System.Collections.Generic.LinkedList<T> 中的下一个节点。
//
// 返回结果:
// 对 System.Collections.Generic.LinkedList<T> 中的下一个节点的引用;或者如果当前节点是 System.Collections.Generic.LinkedList<T>
// 的最后一个元素 (System.Collections.Generic.LinkedList<T>.Last),则为 null。
public LinkedListNode<T> Next { get; }
//
// 摘要:
// 获取 System.Collections.Generic.LinkedList<T> 中的上一个节点。
//
// 返回结果:
// 对 System.Collections.Generic.LinkedList<T> 中的上一个节点的引用;或者如果当前节点是 System.Collections.Generic.LinkedList<T>
// 的第一个元素 (System.Collections.Generic.LinkedList<T>.First),则为 null。
public LinkedListNode<T> Previous { get; }
//
// 摘要:
// 获取节点中包含的值。
//
// 返回结果:
// 节点中包含的值。
public T Value { get; set; }
}
六、LinkedList<T>链表实例
static void Main(string[] args)
{
LinkedList<int> a = new LinkedList<int>(); //创建一个链表
a.AddFirst(3); //在一开始添加一个节点
a.AddLast(1); //在最后添加一个节点
a.AddLast(4); //在最后添加一个节点
foreach (int i in a)
Console.Write(i + " "); //输出3 1 4
Console.WriteLine();
LinkedListNode<int> cur = a.Find(3); //cur对应3所在的第一个位置
if (cur != null)
{
a.AddAfter(cur, 2); //在3后面添加2
a.AddBefore(cur,5); //在3前面添加5
}
foreach (int i in a)
Console.Write(i + " "); //输出5 3 2 1 4
Console.WriteLine();
Console.WriteLine(cur.Next.Value); //cur当前为3的位置,所以下一个为2
Console.WriteLine(cur.Next.Previous.Value); //3的下一个为2,2的上一个仍然为3
Console.WriteLine(cur.Previous); //Previous为上一个节点
a.RemoveFirst();
foreach (int i in a)
Console.Write(i + " "); //返回3 2 1 4
Console.WriteLine();
a.RemoveLast();
foreach (int i in a)
Console.Write(i + " "); //返回3 2 1
Console.WriteLine();
a.Remove(3); //删除值为3的节点,成功返回true,否则false
a.Clear(); //清空所有的节点
Console.Read();
}