Полное руководство по языку программирования С# 14 и платформе .NET 10 / Коллекции

Двухсвязный список LinkedList

Начальный ⏱ 3 мин чтения 👁 2 🕓 обновлено 11.08.2026

Класс LinkedList<T> представляет двухсвязный список, в котором каждый элемент хранит ссылку одновременно на следующий и на предыдущий элемент.

Создание связанного списка

Для создания связного списка можно принименять один из его конструктора. Например, создадим пустой связный список:


LinkedList<string> people = new LinkedList<string>();

В данном случае связанный список people предназначен для хранения строк.

Также можно в конструктор передать коллекцию элементов, например, список List, по которому будет создан связный список:


var employees = new List<string> { "Tom", "Sam", "Bob" };

LinkedList<string> people = new LinkedList<string>(employees);
foreach (string person in people)
{
    Console.WriteLine(person);
}

LinkedListNode

Если в простом списке List<T> каждый элемент представляет объект типа T, то в LinkedList<T> каждый узел представляет объект класса LinkedListNode<T>. А добавляемые в связанный список элементы T фактически обертываются в объект LinkedListNode.

Класс LinkedListNode имеет следующие свойства:

  • Value: возвращает или устанавливает само значение узла, представленное типом T

  • Next: возвращает ссылку на следующий элемент типа LinkedListNode<T> в списке. Если следующий элемент отсутствует, то имеет значение null

  • Previous: возвращает ссылку предыдущий элемент типа LinkedListNode<T> в списке. Если предыдущий элемент отсутствует, то имеет значение null

Свойства LinkedList

Класс LinkedList определяет следующие свойства:

  • Count: количество элементов в связанном списке

  • First: первый узел в списке в виде объекта LinkedListNode<T>

  • Last: последний узел в списке в виде объекта LinkedListNode<T>

Используем эти свойства:


var employees = new List<string> { "Tom", "Sam", "Bob" };

LinkedList<string> people = new LinkedList<string>(employees);
Console.WriteLine(people.Count);            // 3
Console.WriteLine(people.First?.Value);    // Tom
Console.WriteLine(people.Last?.Value);    // Bob

Используя свойства LinkedList и LinkedListNode, можно пройтись по всем элементам списка в прямом или обратном порядке:


LinkedList<string> people = new LinkedList<string>(new[] { "Tom", "Sam", "Bob" });

// от начала до конца списка
var currentNode = people.First;
while(currentNode != null)
{
    Console.WriteLine(currentNode.Value);
    currentNode = currentNode.Next;
}

// с конца до начала списка
currentNode = people.Last;
while (currentNode != null)
{
    Console.WriteLine(currentNode.Value);
    currentNode = currentNode.Previous;
}

Методы LinkedList

Используя методы класса LinkedList<T>, можно обращаться к различным элементам, как в конце, так и в начале списка:

  • AddAfter(LinkedListNode<T> node, LinkedListNode<T> newNode): вставляет узел newNode в список после узла node.

  • AddAfter(LinkedListNode<T> node, T value): вставляет в список новый узел со значением value после узла node.

  • AddBefore(LinkedListNode<T> node, LinkedListNode<T> newNode): вставляет в список узел newNode перед узлом node.

  • AddBefore(LinkedListNode<T> node, T value): вставляет в список новый узел со значением value перед узлом node.

  • AddFirst(LinkedListNode<T> node): вставляет новый узел в начало списка

  • AddFirst(T value): вставляет новый узел со значением value в начало списка

  • AddLast(LinkedListNode<T> node): вставляет новый узел в конец списка

  • AddLast(T value): вставляет новый узел со значением value в конец списка

  • RemoveFirst(): удаляет первый узел из списка. После этого новым первым узлом становится узел, следующий за удаленным

  • RemoveLast(): удаляет последний узел из списка

Применим некоторые из этих методов:


var people = new LinkedList<string>();
people.AddLast("Tom"); // вставляем узел со значением Tom на последнее место
                        //так как в списке нет узлов, то последнее будет также и первым
people.AddFirst("Bob"); // вставляем узел со значением Bob на первое место

// вставляем после первого узла новый узел со значением Mike
if (people.First != null) people.AddAfter(people.First, "Mike");

// теперь у нас список имеет следующую последовательность: Bob Mike Tom
foreach (var person in people) Console.WriteLine(person);

Подобным образом можно создавать связанные списки и других типов:


var company = new LinkedList<Person>();

company.AddLast(new Person("Tom"));
company.AddLast(new Person("Sam"));
company.AddFirst(new Person("Bill"));

foreach (var person in company) Console.WriteLine(person.Name);

class Person
{
    public string Name { get; }
    public Person(string name) => Name = name;
}

Проверь себя

📋 Тест по теме «Двухсвязный список LinkedList» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____<string> people = new LinkedList<string>();
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

var employees = _____ List<string> { "Tom", "Sam", "Bob" };

LinkedList<string> people = new LinkedList<string>(employees);
foreach (string person in people)
{
    Console.WriteLine(person);
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

var employees = new _____<string> { "Tom", "Sam", "Bob" };

LinkedList<string> people = new LinkedList<string>(employees);
Console.WriteLine(people.Count);            // 3
Console.WriteLine(people.First?.Value);    // Tom
Console.WriteLine(people.Last?.Value);    // Bob
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____<string> people = new LinkedList<string>(new[] { "Tom", "Sam", "Bob" });

// от начала до конца списка
var currentNode = people.First;
while(currentNode != null)
{
    Console.WriteLine(currentNode.Value);
    currentNode = currentNode.Next;
}

// с конца до начала списка
currentNode = people.Last;
while (currentNode != null)
{
    Console.WriteLine(currentNode.Value);
    currentNode = currentNode.Previous;
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

var people = new LinkedList<string>();
people._____("Tom"); // вставляем узел со значением Tom на последнее место
                        //так как в списке нет узлов, то последнее будет также и первым
people.AddFirst("Bob"); // вставляем узел со значением Bob на первое место

// вставляем после первого узла новый узел со значением Mike
if (people.First != null) people.AddAfter(people.First, "Mike");

// теперь у нас список имеет следующую последовательность: Bob Mike Tom
foreach (var person in people) Console.WriteLine(person);
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

LinkedList<string> _____ = _____ LinkedList<string>();
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

var employees = new List<string> { "Tom", "Sam", "_____" };

LinkedList<string> people = new LinkedList<string>(employees);
foreach (string person in people)
{
    Console._____(person);
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

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

    Console.WriteLine(person);
foreach (string person in people)
LinkedList<string> people = new LinkedList<string>(employees);
}
var employees = new List<string> { "Tom", "Sam", "Bob" };
{
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Двухсвязный список LinkedList»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Двухсвязный список LinkedList», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

LinkedList<string> people = new LinkedList<string>();
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Двухсвязный список LinkedList»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

var employees = new List<string> { "Tom", "Sam", "Bob" };

LinkedList<string> people = new LinkedList<string>(employees);
foreach (string person in people)
{
    Console.WriteLine(person);
}
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Двухсвязный список LinkedList»
+50 XP

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

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Двухсвязный список LinkedList»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Двухсвязный список LinkedList». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.