我刚刚开始使用 DSA,但我对 C++ 中的 LinkedList 中的某些内容感到困惑。我的问题很长,但如果有人花时间回答我的愚蠢问题,我将非常感激,因为问题的摘要是,当 nextptr 在构造函数中指向 NULL 时,current->nextptr 如何获取节点。
代码如下:
#include <iostream>
using namespace std;
struct node
{
int data;
node *nextptr;
node(int valueUinsert)
{
this->data = valueUinsert;
nextptr = nullptr;
}
};
void InsertAtEnd(node *&head, int valueUinsert)
{
node *n = new node(valueUinsert);
node *counter = head;
if (head == nullptr)
{
head = n;
}
else
{
while (counter->nextptr != nullptr)
{
counter = counter->nextptr;
}
counter->nextptr = n;
}
}
int main()
{
node *head = nullptr;
InsertAtEnd(head, 2);
InsertAtEnd(head, 3);
}
上面是我的链接列表代码,但我仍在尝试理解它。让我向你解释一下我所理解的以及我的问题是什么,如果我有错误的地方请纠正我。
首先我们创建节点类,并在其构造函数中使用 int 值对其进行参数化,该值将作为我们想要放入节点中的数据传递给我们。在这个构造函数中,我们有一个名为 nextptr 的成员,它是一个指针,目前设置为 NULL,而 data 则设置为我们将很快添加到节点中的值。
然后我们在 main 函数中创建一个节点类型的头指针,它也指向 null。现在,为了在链接列表中添加元素,我们创建了函数 InsertatEnd,该函数接受我们在 main 中创建的真实节点类型头指针,以及我们想要添加到列表中的 int 值。
在函数中,我们创建另一个名为 n 的节点类型指针,并在堆中为节点类型对象动态分配内存,该对象接受我们要添加到列表中的值,并将该节点类型对象的地址存储在节点中类型名为 n 的指针。到目前为止我所说的一切都正确吗??
然后我们创建了另一个名为counter的节点类型指针,它指向我们的头指针所指向的samje内存位置,在本例中即为NULL。然后我们检查列表是否为空,将传递的值存储在 head 中,否则我们遍历计数器直到最后,这样我们就可以将传递的值放入,
现在这是我不理解这里的代码/逻辑的地方。我不明白这个 counter->next 是如何工作的
在 while 循环中,我们有这个条件 k 运行这段代码,直到计数器指向 NULL
我们在 main 中写道:
InsertAtEnd(头, 2); InsertAtEnd(头, 3);
现在当InsertAtEnd(head, 2);执行后,它会将值2赋给我们的节点对象,这样节点的数据就会存储值2,从而使n指向2,我说得对吗?
然后在下一行中,它将使我们的计数器指向与头相同的位置,然后当我们到达将运行的 if 语句时,因为我们的头现在指向 NULL,它将使我们的头指针指向与头相同的位置n,它是存储 2 作为数据的节点对象。
然后我们回到main函数并执行InsertAtEnd(head, 3);
现在它将再次将真正的头指针传递给函数,并将值 3 赋予我们的节点对象作为节点的数据问题:它是否应该覆盖之前的值 2?
现在直到这个阶段我们的计数器都指向 null,这是 head 的先前值,但是现在我们的计数器将指向我们的 head 所指向的 2。
现在它将跳过 If 语句并转到 else,这是我不明白的地方。
在 else 语句中我们有 while 循环,它将遍历计数器直到我们得到 NULL,现在 counter->nextptr 是什么意思? counter现在是指向2的指针,而nextptr是指向null的指针,那么这个counter->nextptr是如何工作的,它对我来说没有意义,它是如何遍历的?然后在 while 循环体中,我们有这个
counter = counter->nextptr;
这个 counter->nextptr 如何获取计数器的下一个值?它是如何工作的。请解释一下
我只是想了解当前->下一个是如何工作的?
简而言之,
head
指向列表中的第一个node
,每个node
的nextptr
成员指向列表中的下一个node
,其中最后一个node
的 nextptr
是 nullptr
。
在
main()
中,您的 head
最初是 nullptr
。对 InsertAtEnd()
的第一次调用看到 head
是 nullptr
并更新 head
以指向新的 node
,其 data
是 2
且 nextptr
是 nullptr
。然后,对 InsertAtEnd()
的第二次调用看到 head
不是 nullptr
,因此它会遍历列表,直到找到最后一个 node
,其 nextptr
是 nullptr
,并将该 nextptr
更新为指向新的 node
,其 data
为 3
,nextptr
为 nullptr
。等等。