【问题标题】:Linked list - Insert at end using a rear pointer链表 - 使用后指针插入末尾
【发布时间】:2019-02-22 17:11:08
【问题描述】:

我正在学习链表插入,并遇到以下代码在链表末尾插入一个节点(在一本相当古老且过时的 C++ 书籍中,我仍然在使用我不知道为什么):

void Insert_End(Node * np){
    if (start == NULL){
        start = rear = np;
    }
    else{
        rear -> next = np;
        rear = np;
    }
}

我的问题是不应该 np -> 下一个 = 后方;

PS : np 是在末尾插入的新节点,rear 指向最后一个节点,start 指向第一个节点。

【问题讨论】:

  • 不,(新的)最后一个节点的下一个指针应该保持为NULL。
  • 确实,谢谢。当我发布问题时我想通了。
  • 指向最后一个节点?
  • 这会设置新的列表末尾,这样如果再次调用Insert_End,新节点就会出现在正确的位置。
  • 哦,谢谢! (我之前的评论不小心被删了……如果有未来的人在这里,我问的是最后一行的角色)

标签: c++ c linked-list singly-linked-list


【解决方案1】:

我的问题是不应该是 np -> next = 后方;

不,因为这样就没有节点指向np,因此它不会是任何列表的一部分(除了头部为np的列表)。此外,np 不会在后面,因为它的next 将指向一个节点(之前是rear 的节点)。该示例是正确的实现。

【讨论】:

    【解决方案2】:

    我的问题是不应该是 np -> next = 后方;

    不,下面的图片可以帮助您轻松理解。

    当您第一次使用start = rear = np; 时,所有 3 个节点可能如下所示。

      ------
      |  np  |
       ------
      ^      ^
      |       |
     ----      ----
    |start|   | rear|
     ----      ----
    

    对于连续插入:

    当您使用rear -> next = np; 时,您的列表可能如下所示。

    注意:rear 仍指向列表的上一个最后一个节点,np1 指向np2

      ------         -----
      |  np1 | ---> | np2 |
       ------        -----
      ^       ^
      |       |
     ----      ----
    |start|   | rear|
     ----      ----
    

    当您执行rear = np; 时,您的rear 会更新为指向当前最后一个节点。

      ------         -----
      |  np1 | ---> | np2 |
       ------        -----
      ^              ^
      |              |
     ----           ----
    |start|        | rear|
     ----           ----
    

    【讨论】:

    • 漂亮的 ASCII 艺术。恕我直言,调试时应始终绘制链表。