C#LinkedList链表

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();
}
发布了50 篇原创文章 · 获赞 0 · 访问量 860

猜你喜欢

转载自blog.csdn.net/weixin_40786497/article/details/104155992