当前位置: 首页 > 知识库问答 >
问题:

Last->Next=temp如何工作?

公冶经纶
2023-03-14

这是udemy教程中显示链表的代码,这里我们将使用一个数组并将这些值存储在链表中。我不明白代码是怎么工作的。在下面的代码中,我们存储下一个节点的地址,如何last->next=temp;在我没有创建last=new node这样的最后一个节点的地方工作;我只创建了最后一个指针。我没弄明白,有人能给我解释一下它是怎么工作的吗

#include <iostream>
using namespace std;
 
class Node{
public:
    int data;
    Node* next;
};
 
int main() {
 
    int A[] = {3, 5, 7, 10, 15};
 
    Node* head = new Node;
 
    Node* temp;
    Node* last;
 
    head->data = A[0];
    head->next = nullptr;
    last = head;
 
    // Create a Linked List
    for (int i=1; i<sizeof(A)/sizeof(A[0]); i++){
 
        // Create a temporary Node
        temp = new Node;
 
        // Populate temporary Node
        temp->data = A[i];
        temp->next = nullptr;
 
        // last's next is pointing to temp
        last->next = temp;
        last = temp;
    }
 
    // Display Linked List
    Node* p = head;
 
    while (p != nullptr){
        cout << p->data << " -> " << flush;
        p = p->next;
    }
 
    return 0;
}

共有2个答案

吕峰
2023-03-14

您已经在for循环之前使用last=head变量last初始化为head。这样做是为了确保在向列表中添加其他节点时不会修改原始头。在每次迭代中,使用最后一个节点来跟踪链表中的最后一个节点,以便将每个新节点添加到链表的末尾。

洪逸清
2023-03-14

计算指针的最好方法是用笔(笔)和纸画方框和箭头。

下面是一个(悲伤的)ASCII版本,它描述了所发生的事情:

head->data = A[0];
head->next = nullptr;
last = head;

head指向新创建的节点,last指向与head相同的位置:

   head
    |
    v
+------+------+    
| data | next |
|      |(null)|
|      |      |
+------+------+
   ^
   |
  last

接下来,

// Create a temporary Node
temp = new Node;

// Populate temporary Node
temp->data = A[i];
temp->next = nullptr;

看起来是这样的:

   head                 temp
    |                    |
    v                    v
+------+------+       +------+------+  
| data | next |       | data | next |
|      |(null)|       |      |(null)|
|      |      |       |      |      |
+------+------+       +------+------+
   ^
   |
  last

然后

last->next = temp;

last节点的next成员更改为(在第一次迭代中,此节点与head指向的节点相同):

   head                 temp
    |                    |
    v                    v
+------+------+       +------+------+  
| data | next |       | data | next |
|      |   ---------->|      |(null)|
|      |      |       |      |      |
+------+------+       +------+------+
   ^
   |
  last

最后,使last指向最近创建的节点:

last = temp;

这给出了

   head                 temp
    |                    |
    v                    v
+------+------+       +------+------+  
| data | next |       | data | next |
|      |   ---------->|      |(null)|
|      |      |       |      |      |
+------+------+       +------+------+
                         ^
                         |
                        last

然后从那里重复循环。

 类似资料:
  • 问题内容: 我对迭代器的方法有疑问。如果我的代码包含以下内容(大小为4),请执行以下操作: 在第一次迭代时,迭代器开始指向索引为0的元素?还是喜欢“指数-1”? 我问,因为据我所知,该方法返回集合中的下一个元素。 因此,如果在第一次迭代时迭代器在被调用时从索引0开始,它将返回索引1的元素,而我将无法对索引0的元素做任何事情? 问题答案: 可以将其视为两步过程。首先,它获得迭代器中的下一个项目,然后

  • 为做到无需共享凭据也能临时允许访问(比如用于 GET 请求)对象, radosgw 末端的 swift 也支持临时 URL 功能。要用此功能,需设置 X-Account-Meta-Temp-URL-Key 或可选项 X-Account-Meta-Temp-URL-Key-2 的初始值。 Temp URL 功能需要这些密钥的 HMAC-SHA1 签名。 POST Temp-URL 密钥 向 swif

  • 简介 一般工作中会有我想把某个文件分享给别人,但是又不想直接发给对方,因此需要一个中转站,我把文件上传到这个中转站,然后中转站给我一个可以查看的url,我再把url发给要查看的人。 或者是想把一个文件分享给别人但是由于操作系统不同或者使用的文件编辑器不同而导致展示上有一些差异。 那么这个项目的目的就是为了解决这种需求。目前工作中我会把临时的接口文档写好,然后生成一个url分享给前端或者客户端,并且

  • NodeJS/Express:什么是“app.use”?我读了这篇文章,仍然对这个程序中的控制流感到困惑。为什么如果我访问“localhost:3000/add product”,记录的结果是“这总是运行!在add product中间件中!这总是运行!在另一个中间件中!”(我省略了变更行)这是否意味着在它进入第二个应用程序之后。如我所知,使用每个应用程序。每次向服务器发送请求时都会调用use(中间

  • 描述 (Description) 这不是一个功能。 最后一个关键字是一个循环控制语句,它立即导致循环的当前迭代成为最后一个。 不执行进一步的语句,循环结束。 如果指定了LABEL,那么它将退出LABEL标识的循环,而不是当前封闭的循环。 语法 (Syntax) 以下是此函数的简单语法 - last LABEL last 返回值 (Return Value) 这不会返回任何值。 例子 (Examp

  • 返回序列的最后一个元素。 语法 (Syntax) 以下是语法。 (last seq1) Parameters - 'seq1'是元素的序列列表。 Return Value - Return Value序列的最后一个元素。 例子 (Example) 以下是Clojure中的最后一个例子。 (ns clojure.examples.example (:gen-class)) ;; This p