【发布时间】:2020-05-08 16:13:11
【问题描述】:
我正在努力实现我自己的双向链表。我决定在列表末尾使用哨兵节点,它将存储指向列表中最后一个节点的指针,最后一个节点将存储指向哨兵节点的指针。这是一个好方法还是应该以不同的方式使用哨兵节点?我的代码:
template <class T>
class MyList
{
public:
MyList() : m_first(nullptr), m_last(nullptr), m_sentinel(new Node()) {}
~MyList()
{
delete m_sentinel;
}
void push_back(const T & data);
void pop_back();
void push_front(const T & data);
void pop_front();
class iterator;
iterator begin()
{
if(m_first == nullptr) return iterator(m_sentinel);
return iterator(m_first);
}
iterator end()
{
return iterator(m_sentinel);
}
private:
struct Node;
Node * m_first;
Node * m_last;
Node * m_sentinel;
};
template <class T>
struct MyList<T>::Node
{
Node() : m_data(nullptr), m_next(nullptr), m_prev(nullptr) {}
Node(T * data, Node * next, Node * prev) : m_data(data), m_next(next), m_prev(prev) {}
~Node() { delete m_data; delete m_prev; }
T * m_data;
Node * m_next;
Node * m_prev;
};
【问题讨论】:
-
这不是我对为什么要将哨兵节点用于链表的理解。我的理解是你会使用一个循环链表。如果它不是循环的,则哨兵节点只是增加了不必要的复杂性。特别是因为您已经有了指向第一个和最后一个节点的指针。
-
我可以看到最后一个节点的使用情况,以便利用快速追加到列表的后面。但是对于一个额外的哨兵节点,我没有看到它的实用程序。
标签: c++