我正在尝试在c ++的双向链表中使用空对象模式,但我似乎无法找到一种方法来使用它,同时保持代码清洁。
问题在于以下代码:
node->getNext()->setPrevious(node->getPrevious());
node->getPrevious()->setNext(node->getNext());
如果下一个/上一个节点是getNext
, getPrevious
和NullNode
将返回nullptr
个对象。
失败的用例 - 当节点是头节点时:
以下内容将第二个节点的前一个指针设置为NullNode对象,导致内存泄漏。
node->getNext()->setPrevious(node->getPrevious());
我在这里要完成的是保持NOP并保持代码清除nullptr
和类类型比较,
任何建议都将非常感谢!
答案 0 :(得分:0)
如果您存储上一个和下一个节点,事情会更简单:
Node* Detach( Node* node) {
auto prev = node->getPrevious();
auto next = node->getNext();
prev->setNext( next );
next->setPrevious( prev);
node->setNext( nullNodeAddr);
node->setPrevious( nullNodeAddr);
return node;
}
NOP或Sentinel模式是一种简化操作的方法,从不关心列表头部和尾部的空值。如果你需要在某个地方进行测试,那么你就失败了。