我想知道在下面的代码(注释掉的行)中我可能误解了什么。如果我尝试在遍历链表之前创建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);
,你实际上是把它放在堆上,这让你可以控制对象的生命周期。