在调用append后立即实例化Node时,链接列表会被破坏

时间:2014-07-26 03:26:41

标签: c++ linked-list

我想知道在下面的代码中我可能会产生什么误解(注释掉的行)。如果我在浏览链表之前尝试创建节点,那么从第二次迭代开始,root-> next的值就会搞砸了。

现在代码的运作方式有效,但我不明白为什么其他方式没有。

template <class T>
class Node
{
    public:
        T data;
        Node* next;

        Node(T nodeData) : data(nodeData) { next = nullptr; }
        void append(T nodeData)
        {
            // If I uncomment this, I get the problem
            //Node newNode (nodeData);

            Node* insertionNode = this;
            while(insertionNode->next != nullptr)
            {
                insertionNode = insertionNode->next;
            }
            // Instead of using newNode, I must create the node here
            // insertionNode->next = &newNode;
            insertionNode->next = new Node(nodeData);
        }
};

int main()
{
    int testList[] = {1,2,3,4,5};
    Node<int> rootNode(0);
    for(int i = 0; i < 5; i++)
    {
        rootNode.append(testList[i]);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

您正在堆栈上创建newNodeappend完成后,它将不再存在。通过说new Node(nodeData);,你基本上将它放在堆上,这使你可以控制对象的生命周期。