Używanie wskaźników do usuwania elementu z pojedynczo powiązanej listy

NiedawnoWywiad z Slashdotem Linus Torvalds podał przykład tego, jak niektórzy ludzie używają wskaźników w sposób, który wskazuje, że tak naprawdę nie rozumieją, jak ich używać poprawnie.

Niestety, ponieważ jestem jednym z ludzi, o których mówi, nie zrozumiałem jego przykładu:

Widziałem zbyt wielu ludzi, którzy usunęli wpis o pojedynczej liście, śledząc wpis „prev”, a następnie usuwając wpis, robiąc coś takiego

if (prev)
    prev->next = entry->next;
else
    list_head = entry->next;

a ilekroć widzę kod w ten sposób, po prostu przechodzę „Ta osoba nie rozumie wskazówek”. I to niestety dość powszechne. Ludzie, którzy rozumieją wskaźniki, używają jedynie „wskaźnika do wskaźnika wejścia” i inicjalizują go za pomocą adresu nagłówka listy. A kiedy przechodzą przez listę, mogą usunąć wpis bez użycia warunkowych, po prostu robiąc

*pp = entry->next

Czy ktoś może wyjaśnić, dlaczego to podejście jest lepsze i jak może działać bez instrukcji warunkowej?

questionAnswers(7)

yourAnswerToTheQuestion