È possibile eliminare un nodo senza ottenere il nodo precedente, avendo essa imitare il seguente nodo e l'eliminazione che uno invece:
void delete(Node *n) {
if (!is_sentinel(n->next)) {
n->content = n->next->content;
Node *next = n->next;
n->next = n->next->next;
free(next);
} else {
n->content = NULL;
free(n->next);
n->next = NULL;
}
}
Come puoi vedere, dovrai occuparti appositamente dell'ultimo elemento. Sto usando un nodo speciale come nodo sentinella per contrassegnare il finale che ha content
e next
essere NULL
.
UPDATE: le linee Node *next = n->next; n->next = n->next->next
mescola sostanzialmente il contenuto del nodo, e libera il nodo: Immagine che si ottiene un riferimento al nodo B da cancellare in:
A /To be deleted
next ---> B
next ---> C
next ---> *sentinel*
il primo passo è n->content = n->next->content
: copiare il contenuto delle seguenti nodo al nodo di essere "soppressi":
A /To be deleted
next ---> C
next ---> C
next ---> *sentinel*
Quindi, modificare le next
punti:
A /To be deleted
next ---> C /----------------
next ---| C |
next ---> *sentinel*
La realtà è gratuito il seguente elemento, ottenendo al caso finale:
A /To be deleted
next ---> C
next ---> *sentinel*
Node * next = n-> next; n-> next = n-> next-> next; puoi per favore elaborarlo di più? – user215968
Se la lista dei collegamenti è abbastanza lunga, i contenuti di spostamento saranno una soluzione fattibile? – user215968
@ sconosciuto, sì, sarebbe una soluzione fattibile. Questo approccio potrebbe complicare l'aliasing (un altro codice contiene un riferimento ai nodi interessati e così via); ma lo avrai comunque. – notnoop