Связанный список представил .Net Framework 4. В C# LinkedList — это универсальный тип коллекции, определенный в пространстве имен System.Collections.Generic. Связанный список — это линейная структура данных, в которой элементы хранятся в виде узла. LinkedList состоит из узлов, где каждый узел содержит данные и ссылку на следующий узел в списке. Каждый узел имеет данные и следующий элемент. Показано на изображении ниже

Связанные списки — это типы данных, которые связаны друг с другом. Поскольку каждый узел связанного списка знает адрес другого, узлы могут располагаться в совершенно разных свободных областях памяти.

Существует 4 типа связанного списка

  1. Односвязные списки
  2. Двусвязные списки
  3. Круговые связанные списки
  4. Циклические двусвязные списки

Сначала я расскажу об односвязных списках. Самый простой, простой и легкий для понимания связный список Если вы можете понять односвязный список, вы поймете и другие. Связанный список имеет начальный и конечный элементы. Добавление и удаление элементов можно применять так же, как и в массивах, и лучшим преимуществом является то, что между ними можно добавить новый элемент.

На фото выше вы можете видеть первый и последний элемент (head-20). Первый элемент - это головной узел (я имею в виду 20), а последний элемент - 40. Какой следующий элемент из 20? Да, вы правы, это 30. Мы достаточно поговорили, давайте писать код. Мы создадим свой собственный узел

public class Node
    {
        public int Data { get; set; } //data is our own element(like   20 in the above photo)


        public Node next { get; set; } //next node
        
    }

У нас также есть класс с именем LinkList

public class LinkedList
    {
        Node head;  // shows us the first element
        Node tail;  //last element


        public void AddLast(int value) // helps us add elements in LinkedList(adds  to the end)
        {
            Node element = new Node(); //node to be added
            element.Data = value;
            element.next = null;


            if (head==null)
            {
                head = element; //keep head node
                tail = element; 
               
            }
            else
            {
                tail.next = element; //node after last node
                tail = element; //last node update




            }
        }

        public void Write() //I created this method so you can see the elements
        {
            if (head==null)
            {
                Console.WriteLine("empthy");
            }
            else
            {
                Node temp = head;
                Console.Write("Head");
                while (temp!=null)
                {
                    Console.Write($" -> {temp.Data}");
                    temp = temp.next;
                }
                Console.WriteLine("-> Null");
            }
        }
    }

И, наконец, мы вызываем LinkedList

LinkedList list = new LinkedList();

      list.Add(20);

      list.Add(30);

      list.Add(40);

      list.Write();

Это наш результат

Теперь добавим в конец

public void AddFirst(int value)
        {
            Node element = new Node();
            element.Data = value;


            if (head==null)
            {
                head = element;
                tail = element;


            }
            else
            {
                element.next = head; 
                head = element;
            }
        }


            LinkedList list = new LinkedList();
            list.AddLast(20);
            list.AddLast(30);
            list.AddLast(40);
            list.AddFirst(10);
            list.AddLast(50);
            list.AddLast(5);
            list.AddLast(1 );
             list.Write();

Результат

Я оставляю удаление на вас, вы напишите это

Если вы не понимаете, рекомендую запустить отладку и понаблюдать за всем процессом. Я разместил его на github для вас, если хотите, вы можете посмотреть здесь (GithubLink)