首页 文章

链表中的指针

提问于
浏览
0

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

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);
}

但这不是工作 .
我将用一个方案解释我的理解:

The Beginning
HEAD = NULL;

I add 1
HEAD = [1,NULL];

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

现在,为什么在while循环之后的 n1 是不是't what I wan'?

3 回答

  • 1

    你可以这样想:不管你以前在 while 循环中做了什么,while循环的条件是循环只会在 n1 成为 null 后终止 . 因此,循环后 n1 的值保证为 null .

    但是,while循环之后 n1 的值是无关紧要的,因为你在while循环之后没有使用它 .

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

  • 1

    很简单,

    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]
    

    因此,除非您将前一个元素的头部的下一个指针设置为新元素,否则它将无效

  • 2

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

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

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

    在这种情况下,因为变量 node 指向列表的实际字段,它确实改变了它们 .

相关问题