Единственные проблемы, которые я вижу, это то, что ваш код не будет работать должным образом для сценариев, когда голова или хвост обновляются до NULL.
В основном, если вы удаляете единственный узел, dHead будет указывать на ноль, поэтомувам нужно поставить «охранники» вокруг последующих операторов, таких как
dHead->prev = NULL;
примерно так
if (dHead != NULL) {
dHead->prev = NULL;
}
Один из способов «обойти», имея так много условных выражений, - это присвоить NIL (неtype) element.
NIL - это «узел», который заменяет NULL.Он представляет «вне части данных списка», поэтому его следующим является ВСЕГДА NIL (циклическая ссылка), а его предыдущим является ВСЕГДА NIL (циклическая ссылка).В таких случаях вы гарантируете, что NIL никогда не будет доступен вне списка, и что head-> prev == NIL и tail-> next == NIL.Таким образом, вы можете избежать многих операторов типа if (tail != null) { ... }
.
При такой конструкции пустой список будет таким, где head == NIL && tail == NIL
.Это значительно уменьшает количество операторов if (something == null)
, но у вас все еще есть один оператор if, который нужно учитывать, когда head равен NIL (после удаления чего-либо), вам необходимо установить tail в NIL для согласованности.