1. 简介
链表是一种基础的数据结构,但对于一些初学者来说,实现一个链表还是比较困难的,许多操作作用在头部或尾部时需要特殊处理。比如下面这段代码:
template <typename T> void LinkedList<T>::remove(LinkedListNode<T> * node)
{
if (node -> prev == nullptr)
head = node -> succ; //更新链表头节点
else
node -> prev -> succ = node -> succ;
if (node -> succ != nullptr)
node -> succ -> prev = node -> prev;
}
上述代码进行了两次的空值判断,有可能会更新链表头节点,比较复杂,容易出现遗漏。如果在实现链表的时候借助哨兵节点,则可以有效降低代码量和代码逻辑的复杂程度。
在链表和其它类似数据结构中,数据都保存在节点中。哨兵节点是一种不保存任何数据的节点,用法非常灵活,一般被用来标识数据结构的头尾或没有节点的情况。下面给出一个带哨兵节点的链表实现。
2. 实现
c++代码:
template <typename T> struct LinkedListNode
{
T val; //节点值
LinkedListNode<T> * prev; //前驱节点
LinkedListNode<T> * succ; //后继节点
LinkedListNode()
{
</