当我在调用append后立即实例化Node时,链表会损坏

Linked list gets corrupted when I instantiate a Node immediately after calling append

本文关键字:Node 链表 损坏 实例化 调用 append      更新时间:2023-10-16

我想知道在下面的代码(注释掉的行)中我可能误解了什么。如果我尝试在遍历链表之前创建Node,那么从root->开始的值将从第二次迭代开始混乱。

代码现在的方式可以工作,但我不明白为什么另一种方式不行。

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;
}

您正在堆栈上创建newNode。在append完成后,它将不再存在。通过说new Node(nodeData);,你实际上是把它放在堆上,这让你可以控制对象的生命周期。