Поэтому вам нужно будет сделать что-то подобное. Обратите внимание, что ваш код не обрабатывает случай индекса вне диапазона (т. Е. Указанная позиция либо отрицательна, либо длиннее списка). Похоже, что вы не поддерживаете подсчет длины списка (в связанном коде), поэтому я добавил проверку pos
в цикл for, а также после цикла for, чтобы обработать случай, когда длина pos
была длиннее, чем список. В этом случае теперь код ничего не сделает, но вы можете выбросить исключение из диапазона или что-то подобное, чтобы указать недопустимое условие. В случае удаления головы вам также необходимо позаботиться о фиксации указателя головы. Я предполагаю, что у вас может быть указатель на хвост, поэтому вам нужно добавить проверки, чтобы увидеть, удаляете ли вы хвост и исправляете это.
Примечание.
Я не компилировал это, и поэтому может быть опечатка или две, но она должна по крайней мере указывать на вас в правильном направлении.
void DoubleLinkedLists<T>::deletePosition(int pos) {
if (pos < 0) {} // Should do something in this case
Node* current = head;
// Added null check to keep from continuing past the end of the list
for(int i = 1; i < pos && current != nullptr; i++) {
current = current->next;
}
if (current != nullptr)
{
// If we are at the head, there isn't a previous
if (current != head)
{
current->previous->next = current->next;
}
else
{
// In this case, we are removing the head, need to reset head to the next Node
head = current->next;
}
if (current->next != nullptr)
{
current->next->previous = current->previous;
}
else if (current == tail)
{
// In this case we are removing the tail, need to reset tail pointer
tail = current->previous;
}
delete current; // Cleans up the node we are deleting
}
}