Вставить раньше в связанный список? - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь проанализировать этот код, который вставляется в приведенный ранее связанный список, но я считаю, что в коде есть что-то избыточное:

             //  new_n->next = p->next;
               // p->next = new_n;

Я считаю, что нет необходимости назначать p-> next = new_n;так как мы уже переместили new_n на то, на что указывает p-> next?/

  template <typename Object>
    bool insertBeforeS(SNode<Object>* node, Object before, Object newValue) {
        SNode<Object> *new_n = new SNode<Object>(newValue);
        for (SNode<Object> * p = node; p != nullptr && p->next != nullptr; p = p->next) {
            if (p->data == before) {
                new_n->data = p->data;
                p->data = newValue;
                new_n->next = p->next;
                p->next = new_n;
                return true;
            }
        }

        return false;
    }

1 Ответ

2 голосов
/ 23 сентября 2019

После того, как значение before найдено в списке, новый узел обменивается своим значением со значением узла before.

Тогда этот узел before должен указывать на новый узел и новыйузел должен указывать на узел, на который ранее указывал узел «до».

Таким образом, эти операторы

new_n->next = p->next;
p->next = new_n;

выполняют требуемую задачу, устанавливая элементы данных рядом с узлами.

Первоначально

| before-value| pointer to the next node|

Новый узел

| new-value | nullptr |

Затем значения обмениваются

| new-value| pointer to the next node|
| before-value | nullptr |

И затем после этого утверждения

new_n->next = p->next;

у нас есть

| new-value| pointer to the next node|
| before-value | pointer to the next node |

, а затем после этого утверждения

p->next = new_n;

у нас есть

| new-value| pointer to the new node |
| before-value | pointer to the next node |

Обратите внимание, что функция имеетутечка памяти в случае, когда узел со значением ранее не найден.

...