我们可以通过使用head的简单变量而不是head的指针来实现不使用head指针的链接列表吗?

时间:2019-11-14 20:49:43

标签: c++ pointers linked-list

我们可以通过使用head的简单变量而不是head的指针来实现不使用head指针的链接列表吗?

2 个答案:

答案 0 :(得分:2)

是的。如果要使用前哨节点实现循环链​​表,则前哨节点可以是也可以用作头部的简单变量。

或者,您可以使用std::optional实例作为头部。

答案 1 :(得分:1)

在某些情况下,您可以,但通常情况下不行。而你为什么要呢?我现在可以想到一些原因。以下面的代码为例:

template<class T>
class Node
{
  private:
    T value;
    Node<T> *next;
};

class MyLinkedList
{
  private:
    bool isEmpty; // indicates wether the list is empty or not
    Node head;  // Head as member
};

但是此代码有几个主要缺陷:

  1. 添加或删除列表或对列表执行任何操作时,您始终需要关心isEmpty
  2. 如果head没有默认构造函数,则无法初始化T
  3. 删除最后一个元素时,您必须调用技术上仍在作用域内的对象的析构函数。
  4. 在删除最后一个元素然后删除空列表时,Node::value的析构函数将被调用两次

不知道这些是否全部都是原因,但我认为,仅#2就足以解决这个问题。

您当然可以使用std::optional,但这只是带有包装的指针。即使没有默认构造函数,它也可以工作,因此可以选择。尽管它的使用方式与(智能)指针相同,所以它不是“头部的简单变量”