在 C++ 中插入链表的尾部无法正常工作

Insert to tail for linked list in C++ not working correctly

这是我在 C++ 中实现的 insert to tail 函数:

void List::InsertBack(int x)
{
    Node *temp = root;
    Node *nNode = new Node(x);

    if (temp == NULL)
    {
        temp = nNode;
    }
    else
    {
        while (temp != NULL)
        {
            temp = temp->next;
        }
        temp = nNode;
    }
}

当我调用函数 list1.InsertBack(10) 然后打印出链表时,它显示为空。 但是,如果我更改

if (temp == NULL)
{
    temp = nNode;
}

if (temp == NULL)
{
    root = nNode;
}

然后它就可以工作并打印出 10 就好了。知道发生了什么事吗?关于 C++ 中的指针,有什么我不理解的地方吗?

temp 只存在于函数调用的范围内,所以当你在第一种情况下设置 temp = nNode 时,temp 在函数结束时被销毁。 root 存在于函数调用之外,因此您需要设置 root= nNode

Node* temp = root;

此处您正在创建 root 指针的副本并使用 temp 对其进行初始化。您对 temp 指针所做的更改根本不会影响 root。所以当你这样做时:

temp = nNode;

这只会改变局部变量 temp 指向的内容,而不是 root 本身指向的内容。修改 root 的正确方法是分配给它本身:

root = nNode;

注意:如果 temp 是对指针的引用,则代码可以工作。

接下来,当您追加到链表时,您必须找到 next 等于 NULL 的最后一个节点。一旦你有了那个节点,你需要更新它的 next 指针,所以正确的迭代方式应该是这样的:

while (temp->next)
    temp = temp->next;
temp->next = nNode;

最后的赋值影响实际节点,而不是指针。

您在代码中定义了两个局部变量,nNodetemp

因为 temp 是您唯一更改的内容,而不是初始化它的成员 (root),所以没有任何更改也就不足为奇了。
除了每次调用该函数时都会产生内存泄漏。

temp改成Node**,用root的地址(指向新节点的第一个候选地址)初始化:

void List::InsertBack(int x) {
    Node **temp = &root;
    while(*temp) // As long as we don't point to the null-pointer we want to replace
        temp = &temp[0]->next; // move to the next node
    *temp = new Node(x);
}

您应该将 while(temp != NULL) 更改为 while(temp->next != NULL) temp = nNodetemp->next = nNode.

或者for (temp = root; temp->next != NULL; temp = temp->next);就像转发你的指针。