我想知道在下面的代码中我可能会产生什么误解(注释掉的行)。如果我在浏览链表之前尝试创建节点,那么从第二次迭代开始,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;
}
答案 0 :(得分:2)
您正在堆栈上创建newNode
。 append
完成后,它将不再存在。通过说new Node(nodeData);
,你基本上将它放在堆上,这使你可以控制对象的生命周期。