Удаление LinkedList: почему бы нам не переопределить голову с предыдущей? - PullRequest
0 голосов
/ 02 ноября 2019

Просмотр моих структур данных, для некоторых новых требований собеседования. Итак, у меня есть метод удаления для Linked-List.

public Link delete(int key) {
    Link current = first;
    Link previous = first; 
    while(current.iData != key) {
        if(current.next == null) 
            return null;
        else {
            previous = current; 
            current = current.next;
        }
    }

    if(current == first)
        first = first.next;
    else
        // just bypass it
        previous.next = current.next;
    return current;
}

Я думаю, что до сих пор понимаю. Но мне любопытно в этой строке:

// just bypass it
previous.next = current.next;

Почему бы нам не переопределить head (в этом примере, представленном как first) с previous? Или это была бы неправильная логика? как

// just bypass it
previous.next = current.next;
first=previous;

Я имею в виду previous и current - просто указатели для перебора списка. А реальные данные после удаления находятся в first правильно? Извините, если это было бы странно думать, почему. Иногда моя странная интуиция просто проявляется при изучении алгоритмов, главным образом потому, что я как бы слаб

1 Ответ

1 голос
/ 02 ноября 2019

Это приведет к тому, что ваш связанный список потеряет все узлы, предшествующие предыдущему. Если у вас был связанный список со следующими значениями:

[1, 2, 3, 4, 5, 6, 7, 8]

и вы позвонили delete(7), ваша голова укажет на 6, и у вас будет связанный список [6, 8].

...