基础数据结构之数组与链表(四)

        本篇主要介绍“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&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值