Non è più difficile.
Con gli elenchi doppiamente collegati, quando si inserisce, si allocerà la memoria e quindi si collegherà con il nodo head o precedente e con la coda o il nodo successivo. Quando si elimina, si verrà scollegati esattamente dallo stesso, quindi si libererà memoria. Tutte queste operazioni sono simmetriche.
Ciò presuppone che in entrambi i casi si disponga del nodo da inserire / eliminare. (E nel caso dell'inserzione, che hai anche il nodo da inserire prima, quindi in un certo senso, l'inserimento potrebbe essere considerato leggermente più complicato.) Se stai cercando di eliminare non avendo il nodo da eliminare, ma il payload del nodo, quindi ovviamente dovrai prima cercare nell'elenco il payload, ma non è un difetto di eliminazione, vero?
Con alberi bilanciati, lo stesso vale: un albero generalmente ha bisogno di essere equilibrato immediatamente dopo un inserimento e anche immediatamente dopo una cancellazione. È una buona idea provare ad avere solo una routine di bilanciamento e applicarla dopo ogni operazione, indipendentemente dal fatto che si tratti di un inserimento o di una cancellazione. Se stai cercando di implementare un inserimento che lascia sempre l'albero equilibrato, e anche una cancellazione che lascia sempre l'albero equilibrato, senza che i due condividano la stessa routine di bilanciamento, stai complicando inutilmente la tua vita.
In breve, non vi è alcun motivo per cui uno dovrebbe essere più difficile dell'altro, e se lo stai scoprendo, è in effetti possibile che tu sia vittima della tendenza (molto umana) di trovare più naturale pensare costruttivamente che sottrattivamente, il che significa che potresti implementare la cancellazione in un modo più complicato di quanto debba essere. Ma questo è un problema umano. Da un punto di vista matematico, non vi è alcun problema.
pop
,extract-min
?