双链表中的空对象模式

时间:2014-04-17 13:40:06

标签: c++ c++11 linked-list doubly-linked-list null-object-pattern

我正在尝试在c ++的双向链表中使用空对象模式,但我似乎无法找到一种方法来使用它,同时保持代码清洁。

问题在于以下代码:

node->getNext()->setPrevious(node->getPrevious());
node->getPrevious()->setNext(node->getNext());
如果下一个/上一个节点是getNext

getPreviousNullNode将返回nullptr个对象。

失败的用例 - 当节点是头节点时:

以下内容将第二个节点的前一个指针设置为NullNode对象,导致内存泄漏。

node->getNext()->setPrevious(node->getPrevious());

我在这里要完成的是保持NOP并保持代码清除nullptr和类类型比较,

任何建议都将非常感谢!

1 个答案:

答案 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模式是一种简化操作的方法,从不关心列表头部和尾部的空值。如果你需要在某个地方进行测试,那么你就失败了。