将值插入链表前面并返回类对象

时间:2017-08-03 17:47:18

标签: c++ class linked-list

所以我有以下课程:

template <class T>
class List : public ContainerIfc <T> {
public:
    List();
    ~ List();
    List(const List&);
    List <T>& operator = (List&);
    List <T>& pushFront(T);
    List <T>& pushBack(T);
    List <T>& popFront(T&);
    List <T>& popBack(T&);
    int getSize();
    bool isEmpty();
    T front();
    T back();
    T& operator [](int);
private:
    Node<T> *head;
};

以及以下节点:

template <class T>
class Node {
public:
    T data;
    Node<T> *next;
    Node(T e) {
        data = e;
        next = NULL;
    }
};

我想编写一个pushFront函数,它将值添加到链表的前面。我已经有了以下代码。我无法弄清楚如何让它返回一个List对象。我认为我的功能可以正常工作,它不会返回List。关于如何做到这一点的任何想法?

template <class T>
List <T>& List<T>::pushFront(T n){

    Node<T> *temp = new Node<T>(n);
    temp->next = head;



}

1 个答案:

答案 0 :(得分:6)

这里有一些问题。首先,您永远不会直接更新指向您添加的新节点。

其次,就返回List对象引用而言 - 您有隐式参数this,它是指向您当前正在修改的对象的指针。只需返回其解除引用:

template <class T>
List <T>& List<T>::pushFront(T n){

    Node<T> *temp = new Node<T>(n); //Create a new node
    temp->next = head; //point its next to the current head
    head = temp; //Update head so our node is front of the list

    return *this; //Return a reference of ourself
}

最后,在您的Node构造函数中,请注意NULL(有关详细信息,请参阅here)。

此外,作为一个快速的方法 - 您实施链接列表的方式,您应该注意成员函数back()push_back()pop_back()。假设您只有一个头指针,则每个操作都需要您遍历整个列表(这称为O(n)运行时)。这可能不是小列表中的问题,但随着您的列表变大,这将变得越来越糟。

您会注意到在C++ Standard Library这样广泛使用的库中,通常根本无法实现的功能(请参阅vector,请注意缺少的push / pop_front)。您可以通过添加尾部指针并更改为双向链接列表来解决此问题,但当然这会使您的所有其他功能变得更加复杂。在一天结束时,这是一个权衡。