本篇主要介绍“The Singly-Linked List with a sentinel”。它是单链表诸多变种类型中的一种,参考上一篇的图d。sentinel是一个空节点,始终占据链表的首位,并一直存在链表中(即使是空链表),它本身不存储数据。sentinel节点的设计,实际上是一种编程技巧,它可以简化链表的某些操作。比如,对Extract函数的简化。此外,该链表的尾节点的next指针不再指向NULL,而是指向sentinel,它是一个循环链表。
一、实现代码
#ifndef LINKED_LIST_H
#define LINKED_LIST_H
#include <stdexcept>
namespace FoundationalDataStructure
{
// forward declaration
template <typename T>
class LinkedList;
template <typename T>
class Node
{
public:
T const & Datum() const;
Node const * Next() const;
friend LinkedList<T>;
private:
T datum;
Node * next;
Node(T const &, Node *);
};
template <typename T>
class LinkedList
{
public:
LinkedList();
~LinkedList();
LinkedList(LinkedList const &);
LinkedList & operator=(LinkedList const &);
Node<T> const * Head() const;
Node<T> const * Tail() const;
Node<T> const * Sentinel() const;
bool IsEmpty() const;
T const & First() const;
T const & Last() const;
void Prepend(T const &);
void Append(T const &);
void Extract(T const &);
void Purge();
void InsertAfter(Node<T> const *, T const &);
void InsertBefore(Node<T> const *, T const &);
private:
Node<T> sentinel;
Node<T> *& head; // the reference of a pointer
Node<T> * tail;
};
//Implementation/
template <typename T>
Node<T&