如何实现两个成员函数(push_front和析构函数)?

How to implement the two member functions (push_front and the destructor)?

我正在尝试实现两个成员函数,即 push_frontdestructor。我写了 push_front 函数的代码。但我似乎,我在任何地方都做错了。我该如何解决这个问题?如何正确地在 Linked-List 前面插入一个节点?

template <typename T>
class Node {
public:
    Node():next_p_{nullptr} {}
    Node(T v, Node* n):data_{v}, next_p_{n} {}
   ~Node() {};

    void     setData( T &v ) { data_ = v; }
    const T &getData() const { return data_; }
    void  setNext( Node *n ) { next_p_ = n; }
    Node *getNext() const { return next_p_; }

private:
  T data_;
  Node *next_p_;
};

template <typename T>
class LinkedList {
private:
  Node<T> *head_ptr_;
public:
    LinkedList():head_ptr_{nullptr} {}
   ~LinkedList() {
    }

    // Insert at the front of the linked list (UPDATED)
    void push_front( T v ){
        Node *new_node = new Node;
        new_node->setNext(*head_ptr_) = v;
        new_node->next_p_ = this->head_ptr_;
        this->head_ptr_ = new_node;
    }
};

第一个 Node 构造函数获取值和下一个指针,使用它一步创建新节点。

在将 head_ptr_ 用作下一个指针时,您不应该取消引用它。它已经是 Node*,这是 head_ptr_.

的正确类型
    void push_front( T v ){
        Node *new_node = new Node(v, head_ptr_);
        this->head_ptr_ = new_node;
    }

我还建议不要处理手动内存管理,而是使用智能指针来稍微简化您的生活。

使用 std::unique_ptr 您将不必处理回收从免费存储分配的内存。

这种方法的一个警告是你失去了复制 List 的能力,但通常这就是你想要的。

template<typename T>
class List { 
    struct Node { 
        Node( T value ) noexcept
            : data{ std::move_if_noexcept( value ) }
        { }

        T data;
        std::unique_ptr<Node> next{ nullptr };
    };
public:
    auto push_front( T value ) -> void {
        auto node{ std::make_unique<Node>( std::move_if_noexcept( value ) ) };
        std::swap( node->next, head_ );
        std::swap( head_, node );
    }

    ~List()
    {
        while (head_) {
            std::unique_ptr<Node> tmp(std::move(head_));
            head_ = std::move(tmp->next);
        }
    }
private:
    std::unique_ptr<Node> head_{ nullptr };
};