c++ - 在链表的末尾插入一个节点

标签 c++ data-structures linked-list

下面的片段对于在链表的末尾插入一个节点是无效的。

void insert_end(int item){

    nodeptr newNode = new ListNode;
    newNode->data = item;
    newNode->next = NULL;

    if(head == NULL){
        head = newNode;
        curr = head;

    }else{
        curr = head;

        while(curr != NULL) curr = curr->next;
        curr = newNode;
    }
}

在链表末尾插入一个节点有效的另一个片段。

void insert_end(int item){

    nodeptr newNode = new ListNode;
    newNode->data = item;
    newNode->next = NULL;

    if(head == NULL){
        head = newNode;
        curr = head;

    }else{
        curr = head;

        while(curr->next != NULL) curr = curr->next;

        curr->next = newNode;
    }
}

我的问题是为什么第一个无效?实际上两个片段应该是相似的。 假设我已经有三个节点。现在我想插入另一个节点。

  1. 作为第一个算法,当 curr = NULL 时,while 循环将不满足。
  2. 作为第二种算法,当 curr->next = NULL 时,while 循环将不满足。

当“while 循环”终止时,我可以说第一个算法的“curr”和第二个算法“curr->next”都很相似吗? 如果不相似那为什么呢?

最佳答案

您必须了解指针是一个变量,其值是一个地址。

第一个算法是错误的,因为当你完成 while 循环的迭代时,curr 指向 NULL(地址 0x0),而 NULL 不是你列表的有效节点。

第二个算法有效,因为当您完成 while 循环的迭代时,curr 指向列表的最后一个节点,并且您将 newNode 添加到 curr->next,用 newNode 的地址替换 NULL。

希望对您有所帮助! :)

关于c++ - 在链表的末尾插入一个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42829573/

相关文章:

c++ - SIGSEGV 搜索(修改后的)双向列表时

arrays - Perl:使用 'splice()' VS 链表插入数组的性能

C++ valgrind 错误

c++ - 如何在派生类中初始化静态成员?

google-app-engine - 有什么方法可以在 Golang 中处理带有空格的 Google Datastore Kind Property 名称?

c++ - C++可以设计一种将指针保存在连续内存中并且不会使它们无效的数据结构吗?

c - 如何在遍历单链表时删除任意节点?

algorithm - 修改 A* 以在矩形网格上找到最接近多个目标的路径

C++ 取消分配 2d int 数组错误

c++ - http请求中的QNetworkReply和QNetworkAccessManager超时