链表中的指针

Pointers in linked lists

本文关键字:指针 链表      更新时间:2023-10-16

我目前正在研究列表(试图重新创建它们),遇到了一个奇怪的问题。这是我的结构:

struct listNode{
    listNode(int n, listNode* ne = NULL){
        value = n;
        next = ne;
    }
    int value;
    listNode* next;
};
listNode* head = NULL;

现在我做了一个函数,在底部添加一个元素:

void add(int n){
    if(head == NULL){
        head = new listNode(n);
        return;
    }
    listNode* n1 = head;
    while(n1 != NULL){ //Should be: while(n1->next != NULL){
        n1 = n1->next;
    }
    n1 = new listNode(n); //Should be: n1->next = new listNode(n);
}

但这并没有增加任何元素。现在,我已经找到了解决方案(见上面的评论),我的问题是我不明白为什么我的第一个函数不起作用
我将用一个方案来解释我所理解的内容:

开始
HEAD=空;

我加1
HEAD=[1,空];

我添加了2
while循环到达最后一个元素(其中"next"为NULL),并在其中创建新元素
HEAD=[1,new listNode(2)]
结果
HEAD=[1,POINTER][2,NULL];

现在,为什么while循环后的n1不是我希望的样子?

你可以这样想:无论你过去在while循环中做什么,while循环的条件是,只有当n1变成null时,循环才会终止。因此,保证循环后n1的值为null

但是,while循环之后的n1值是不相关的,因为在while循环后没有使用它。

另一方面,您的最后一条指令是n1 = new listNode(n);,所以您创建了一个新的listNode,并将其分配给n1,然后您离开函数,就永远忘记了它。(所以,新节点被泄露了。)

函数不起作用,因为n1是函数的局部变量。变量的任何更改都不会影响列表的其他节点。

您应该更改列表的原始节点。该功能可以通过以下方式编写

void add( int value )
{
    listNode **node = &head;
    while ( *node ) node = &( *node )->next;
    *node = new listNode( value );
}

在这种情况下,因为变量node指向列表的实际字段,所以它确实会更改它们。

Is很简单,

while(n1 != NULL){
    n1 = n1->next;
}
// n1 here is null
// head here is [1, NULL]
n1 = new listNode(n);
// n1 here is something
// head here is [1, NULL]

因此,除非您将前一个元素的下一个指针指向新元素,否则它将无法在

中工作