Вставка значения в связанный список в Ruby

Вот рабочая версия калькулятора без пользовательской операции: http://cpp.sh/7ckas

Теперь, если вы хотите, чтобы ваш пользователь выбрал операцию, вам нужно будет сделать еще одну работу. Вы не можете просто взломать его, используя '& amp; & amp;'. Вместо этого вам нужно создать какую-то абстракцию.

Например, вы можете спросить пользователя: «Выберите операцию: (1) плюс (2) минус». Затем пользователь вводит число, соответствующее требуемой операции.

Затем вы можете использовать оператор if на этом номере. Если 1, добавьте числа. Если 2, минус их.

Попробуйте сами и сообщите мне, если у вас возникнут проблемы с его работой.

2
задан ggorlen 18 January 2019 в 22:51
поделиться

1 ответ

Функция insert здесь работает, потому что current_node.next = _node является постоянной модификацией объекта в списке, на который указывает head. После этого вызова, даже если current_node собирать мусор (это просто временный указатель), у узла, на который он указывал в строке current_node.next = _node, свойство .next постоянно изменено.

Вот схема добавления нового узла 3 в список 1->2->nil:

(before the `until` loop)

+---------+   +---------+
| data: 1 |   | data: 2 |   
| next: ----> | next: ----> [nil]
+---------+   +---------+
  ^    ^
  |    |
head  current_node 
(after the `until` loop; `current_node.next == nil`)
(and before `current_node.next = _node`)

+---------+   +---------+
| data: 1 |   | data: 2 |   
| next: ----> | next: ----> [nil]
+---------+   +---------+
     ^             ^
     |             |
   head        current_node 
(after `current_node.next = _node`)

+---------+   +---------+   +---------+
| data: 1 |   | data: 2 |   | data: 3 |   
| next: ----> | next: ----> | next: ----> [nil]
+---------+   +---------+   +---------+
     ^             ^
     |             |
   head        current_node 

Кстати, этот метод insert демонстрирует плохой дизайн; каждая вставка представляет собой O (n) линейную операцию времени, требующую обхода всего списка. Улучшенный дизайн класса LinkedList будет предлагать указатель tail, позволяющий O (1) вставлять постоянное время в конец списка. С другой стороны, класс может предложить add_front() без хвостового указателя, который установит new_head.next = old_head и head = new_head.

0
ответ дан ggorlen 18 January 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: