C++双向链表使用迭代器删除尾节点逻辑错误修复求助
双向链表迭代器删除尾节点修复方案
现有代码问题
你当前的实现存在3个核心问题:
- 未更新双向链表本身的
last成员指针,删除原尾节点后,链表的last仍指向已被释放的内存 - 未兼容删除的是链表最后一个有效节点的边界场景,没有同步清理BOF/EOF哨兵节点,和类内置的
pop()逻辑不统一 - 指针操作顺序不合理,存在野指针访问风险
正确实现代码
// 先确认当前节点是尾节点(符合你的调用场景) assert(currentNode == list->getLast()); Node<TYPE>* elementToDelete = currentNode; Node<TYPE>* prevNode = elementToDelete->getPrevious(); Node<TYPE>* eofNode = elementToDelete->getNext(); // 尾节点的next固定是EOF哨兵 // 处理删除后链表为空的场景 if (list->size() == 1) { // 和pop()逻辑对齐,删除两个哨兵节点 delete elementToDelete->getPrevious(); // BOF哨兵 delete eofNode; // EOF哨兵 list->first = nullptr; list->last = nullptr; this->currentNode = nullptr; // 没有有效节点了,current置空 } else { // 把前一个节点和EOF哨兵连接 prevNode->setNext(eofNode); eofNode->setPrevious(prevNode); // 更新链表的last指针为新的尾节点 list->last = prevNode; // 迭代器current指向新的尾节点,符合你的预期 this->currentNode = prevNode; } // 释放原尾节点内存 delete elementToDelete; list->decreaseSize();
逻辑说明
- 提前缓存待删节点的前后指针,避免后续修改指针后访问野内存
- 完全对齐
DoubleLinkedList内置的节点管理逻辑:只剩最后一个节点时同步清理BOF/EOF哨兵,避免内存泄漏 - 显式更新链表的
last指针和迭代器的currentNode指针,两者都指向新的尾节点,符合预期 - 所有哨兵节点的前后指向都同步更新,不会破坏链表的遍历逻辑
内容的提问来源于stack exchange,提问作者Nicolas Pellerin
相关产品推荐
相关产品推荐

