0

我正在尝试在 C++ 的双向链表中使用空对象模式,但我似乎找不到在保持代码干净的同时使用它的方法。

问题在于以下代码:

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

getNext如果下getPrevious一个NullNode/上一个节点是nullptr.

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

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

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

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

任何建议将不胜感激!

4

1 回答 1

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

于 2014-04-17T14:28:01.643 回答