📜  C#中的链表实现

📅  最后修改于: 2021-05-29 21:44:36             🧑  作者: Mango

LinkedList是一种线性数据结构,可将元素存储在非连续位置。链接列表中的元素使用指针相互链接。换句话说,LinkedList由节点组成,其中每个节点都包含一个数据字段和到列表中下一个节点的引用(链接)。
在C#中,LinkedList是集合的通用类型,它在System.Collections.Generic命名空间中定义。它是一个双向链表,因此,每个节点都指向下一个节点,并指向上一个节点。它是一个动态集合,可以根据您程序的需要进行扩展。它还提供了快速的插入和删除元素。

重要事项:

  • LinkedList类实现ICollection IEnumerable IReadOnlyCollection ICollectionIEnumerableIDeserializationCallbackISerializable接口。
  • 它还支持枚举器。
  • 您可以删除节点,然后将它们重新插入到同一列表或另一个列表中,这样就不会在堆上分配任何其他对象。
  • LinkedList 对象中的每个节点的类型为LinkedListNode
  • 它不支持链接,拆分,循环或其他可能会使列表处于不一致状态的功能。
  • 如果LinkedList为空,则First和Last属性包含null。
  • LinkedList的容量是LinkedList可以容纳的元素数。
  • 在LinkedList中,允许存储重复的但类型相同的元素。

如何创建一个LinkedList?

LinkedList类具有3个用于创建LinkedList的构造函数,如下所示:

  • LinkedList():此构造函数用于创建为空的LinkedList类的实例。
  • LinkedList(IEnumerable):此构造函数用于创建LinkedList类的实例,该实例包含从指定IEnumerable复制的元素,并具有足够的容量来容纳复制的元素数量。
  • LinkedList(SerializationInfo,StreamingContext):此构造函数用于创建LinkedList类的实例,该实例可使用指定的SerializationInfo和StreamingContext进行序列化。

让我们看看如何使用LinkedList()构造函数创建一个LinkedList:

步骤1:借助using关键字,在程序中包含System.Collections.Generic命名空间:

using System.Collections.Generic;

步骤2:使用LinkedList类创建一个LinkedList,如下所示:

步骤3: LinkedList提供了4种不同的方法来添加节点,这些方法是:

  • AddAfter:此方法用于在LinkedList中的现有节点之后添加新节点或值。
  • AddBefore:此方法用于在LinkedList中的现有节点之前添加新节点或值。
  • AddFirst:此方法用于在LinkedList的开始处添加新的节点或值。
  • AddLast:此方法用于在LinkedList的末尾添加新的节点或值。

步骤4:通过使用foreach循环或使用for循环访问LinkedList的元素。如下例所示。

例子:

// C# program to illustrate how 
// to create a LinkedList
using System;
using System.Collections.Generic;
  
class GFG {
  
    // Main Method
    static public void Main()
    {
  
        // Creating a linkedlist
        // Using LinkedList class
        LinkedList my_list = new LinkedList();
  
        // Adding elements in the LinkedList
        // Using AddLast() method
        my_list.AddLast("Zoya");
        my_list.AddLast("Shilpa");
        my_list.AddLast("Rohit");
        my_list.AddLast("Rohan");
        my_list.AddLast("Juhi");
        my_list.AddLast("Zoya");
  
        Console.WriteLine("Best students of XYZ university:");
  
        // Accessing the elements of 
        // LinkedList Using foreach loop
        foreach(string str in my_list)
        {
            Console.WriteLine(str);
        }
    }
}
输出:
Best students of XYZ university:
Zoya
Shilpa
Rohit
Rohan
Juhi
Zoya

如何从LinkedList中删除元素?

在LinkedList中,允许从LinkedList中删除元素。 LinkedList 类提供了5种不同的方法来删除元素,这些方法是:

  • Clear():此方法用于从LinkedList中删除所有节点。
  • Remove(LinkedListNode):此方法用于从LinkedList中删除指定的节点。
  • Remove(T):此方法用于从LinkedList中删除第一次出现的指定值。
  • RemoveFirst():此方法用于删除LinkedList开头的节点。
  • RemoveLast():此方法用于删除LinkedList末尾的节点。

例子:

// C# program to illustrate how to
// remove elements from LinkedList
using System;
using System.Collections.Generic;
  
class GFG {
  
    // Main Method
    static public void Main()
    {
  
        // Creating a linkedlist
        // Using LinkedList class
        LinkedList my_list = new LinkedList();
  
        // Adding elements in the LinkedList
        // Using AddLast() method
        my_list.AddLast("Zoya");
        my_list.AddLast("Shilpa");
        my_list.AddLast("Rohit");
        my_list.AddLast("Rohan");
        my_list.AddLast("Juhi");
        my_list.AddLast("Zoya");
  
        // Inital number of elements
        Console.WriteLine("Best students of XYZ "+
                         "university initially:");
  
        // Accessing the elements of 
        // Linkedlist Using foreach loop
        foreach(string str in my_list)
        {
            Console.WriteLine(str);
        }
  
        // After using Remove(LinkedListNode)
        // method
        Console.WriteLine("Best students of XYZ"+
                         " university in 2000:");
  
        my_list.Remove(my_list.First);
  
        foreach(string str in my_list)
        {
            Console.WriteLine(str);
        }
  
        // After using Remove(T) method
        Console.WriteLine("Best students of XYZ"+
                         " university in 2001:");
  
        my_list.Remove("Rohit");
  
        foreach(string str in my_list)
        {
            Console.WriteLine(str);
        }
  
        // After using RemoveFirst() method
        Console.WriteLine("Best students of XYZ"+
                         " university in 2002:");
  
        my_list.RemoveFirst();
  
        foreach(string str in my_list)
        {
            Console.WriteLine(str);
        }
  
        // After using RemoveLast() method
        Console.WriteLine("Best students of XYZ"+
                         " university in 2003:");
  
        my_list.RemoveLast();
  
        foreach(string str in my_list)
        {
            Console.WriteLine(str);
        }
  
        // After using Clear() method
        my_list.Clear();
        Console.WriteLine("Number of students: {0}",
                                     my_list.Count);
    }
}
输出:
Best students of XYZ university initially:
Zoya
Shilpa
Rohit
Rohan
Juhi
Zoya
Best students of XYZ university in 2000:
Shilpa
Rohit
Rohan
Juhi
Zoya
Best students of XYZ university in 2001:
Shilpa
Rohan
Juhi
Zoya
Best students of XYZ university in 2002:
Rohan
Juhi
Zoya
Best students of XYZ university in 2003:
Rohan
Juhi
Number of students: 0

如何检查LinkedList中元素的可用性?

在LinkedList中,可以使用Contains(T)方法检查给定值是否存在。此方法用于确定值是否在LinkedList中。

例子:

// C# program to illustrate how 
// to check whether the given 
// element is present or not 
// in the LinkedList
using System;
using System.Collections.Generic;
  
class GFG {
  
    // Main Method
    static public void Main()
    {
  
        // Creating a linkedlist
        // Using LinkedList class
        LinkedList my_list = new LinkedList();
  
        // Adding elements in the Linkedlist
        // Using AddLast() method
        my_list.AddLast("Zoya");
        my_list.AddLast("Shilpa");
        my_list.AddLast("Rohit");
        my_list.AddLast("Rohan");
        my_list.AddLast("Juhi");
  
        // Check if the given element
        // is available or not
        if (my_list.Contains("Shilpa") == true) 
        {
            Console.WriteLine("Element Found...!!");
        }
        else 
        {
            Console.WriteLine("Element Not found...!!");
        }
    }
}
输出:
Element Found...!!