Рассмотрим типичный узел в двусвязном списке:
template <class T>
struct Node
{
Node* mPrevious;
Node* mNext;
T mValue;
};
При вставке нового узла между двумя существующими все, что вам нужно сделать, это немного перемонтировать.
void insert(Node* target, Node* newNode)
{
target->mPrevious->mNext = newNode;
target->mPrevious = newNode;
newNode->mPrevious = target->mPrevious;
newNode->mNext = target;
}
Поведение схоже с std::map
(или std::set
, std::multimap
или std::multiset
, поскольку они все реализованы с использованием одной и той же базовой структуры в целом).
Это означает, что любой итератор, указывающий на существующий элемент, также остается действительным. Я настаиваю на существующем элементе бит. Итератор, возвращаемый end
, должен быть пересчитан после вставки или удаления, и его лучше не кэшировать.