Все задачи
Легко Решено: 0 Процент решений: 0%

Операции со связным списком

Смоделируйте связный список: добавление с обоих концов, удаление из начала или по значению и разворот.

Чему вы научитесь

  • Добавлять и удалять узлы с обоих концов
  • Удалять первый узел с заданным значением
  • Разворачивать порядок списка

Условие

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

Обработайте операции по порядку:

  • push_front x: добавить x в начало.
  • push_back x: добавить x в конец.
  • pop_front: удалить первое значение (игнорируется, если список пуст).
  • remove x: удалить первый узел со значением x, если он есть.
  • reverse: развернуть порядок узлов.

Реализуйте linked_list_operations(operations).

Входные данные

operations: Операции.

Выходные данные

Верните значения списка от начала к концу.

Ограничения

0 ≤ число операций ≤ 10,000

−10^9 ≤ x ≤ 10^9

Примеры

Пример 1
Ввод:
operations = ["push_back 2", "push_front 1", "push_back 3", "reverse"]

Ожидаемый вывод:
expected = [3, 2, 1]
Ввод:
std::vector<std::string> operations = {"push_back 2", "push_front 1", "push_back 3", "reverse"};

Ожидаемый вывод:
std::vector<long long> expected = {3, 2, 1};
Ввод:
string[] operations = new string[] {"push_back 2", "push_front 1", "push_back 3", "reverse"};

Ожидаемый вывод:
long[] expected = new long[] {3, 2, 1};

Пояснение

Список становится 1 → 2 → 3, а после разворота — [3, 2, 1].

Пример 2
Ввод:
operations = ["push_back 5", "push_back 7", "push_back 5", "remove 5", "pop_front"]

Ожидаемый вывод:
expected = [5]
Ввод:
std::vector<std::string> operations = {"push_back 5", "push_back 7", "push_back 5", "remove 5", "pop_front"};

Ожидаемый вывод:
std::vector<long long> expected = {5};
Ввод:
string[] operations = new string[] {"push_back 5", "push_back 7", "push_back 5", "remove 5", "pop_front"};

Ожидаемый вывод:
long[] expected = new long[] {5};

Пояснение

remove удаляет только первую 5, остаётся 7 → 5; затем pop_front удаляет 7: [5].

Как подступиться

Сначала попробуйте сами, затем открывайте подсказки по одной.

Подсказка 1

Тип списка с дешёвой вставкой в начало и конец (std::list, LinkedList<T>, deque) делает почти всю работу.

Подсказка 2

remove удаляет только первое совпадение, а pop_front на пустом списке ничего не делает.

Подсказка 3

После разворота началом для следующих push и pop становится другой конец.

Ожидаемая сложность

время O(n²), доп. память O(n)

Ссылки

Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

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