【问题标题】:What does head.next actually mean in linked lists?head.next 在链表中的实际含义是什么?
【发布时间】:2021-10-07 11:05:43
【问题描述】:

我创建了一个带有Node 类的链接列表,该类具有Node nextint data

head.next 是什么意思?我很困惑。

考虑这个列表:1 > 2 > 3 > 4,1 是头部。

现在如果我执行head=head.nexthead 现在指向 2。但是当我执行 head.next=null 时,1 指向 null。有人可以解释为什么会这样吗?

【问题讨论】:

  • 不看你的代码是无法回答的。请构造一个minimal reproducible example。单看变量名,head.next 是头节点之后的节点。

标签: data-structures linked-list tree queue stack


【解决方案1】:

假设您指的是下面的链表示例

#include <bits/stdc++.h>
using namespace std;

class Node {
public:
    int data;
    Node* next;
};

int main()
{
    Node* head = NULL;
    Node* second = NULL;
    Node* third = NULL;

    head = new Node();
    second = new Node();
    third = new Node();

    head->data = 1;
    head->next = second;

    second->data = 2;

    second->next = third;

    third->data = 3;
    third->next = NULL;

    return 0;
}

这里的Node是一个类,其中声明了该节点类next的指针,使用整数类型data存储next指针将指向的数据值

class Node {
public:
    int data;
    Node* next;
};

这里的head是一个Node类的对象,它被创建并且通过使用它之前在其中声明的指针,我们使用head.next = second来指向下一个Node对象。所以现在我们的头对象的指针指向我们创建的第二个对象的地址,这样头对象就与我们的第二个对象链接了。 data 变量用于存储赋予每个对象或在本例中为每个节点的值

    head = new Node();
    second = new Node();
    third = new Node();

    head->data = 1;
    head->next = second;

    second->data = 2;

    second->next = third;

    third->data = 3;
    third->next = NULL;

谈到你的第二点,我不明白你为什么将 head.next 指向 head(itself) 而 head.next = NULL 什么也没给出,因为你必须将指针指向第二个对象才能创建链接列表。

【讨论】:

    【解决方案2】:

    这可能有助于将事物形象化。

    考虑这个列表:1 > 2 > 3 > 4,1 是头部。

     head
      ↓
    ┌───────────┐    ┌───────────┐    ┌───────────┐    ┌───────────┐
    │ value: 1  │    │ value: 2  │    │ value: 3  │    │ value: 4  │
    │ next: ———————→ │ next: ———————→ │ next: ———————→ │ next: null│
    └───────────┘    └───────────┘    └───────────┘    └───────────┘ 
    

    如果我执行head=head.nexthead 现在指向 2

                      head
                       ↓
    ┌───────────┐    ┌───────────┐    ┌───────────┐    ┌───────────┐
    │ value: 1  │    │ value: 2  │    │ value: 3  │    │ value: 4  │
    │ next: ———————→ │ next: ———————→ │ next: ———————→ │ next: null│
    └───────────┘    └───────────┘    └───────────┘    └───────────┘ 
    

    但是当我执行head.next=null时,1指向null

     head
      ↓
    ┌───────────┐    ┌───────────┐    ┌───────────┐    ┌───────────┐
    │ value: 1  │    │ value: 2  │    │ value: 3  │    │ value: 4  │
    │ next: null│    │ next: ———————→ │ next: ———————→ │ next: null│
    └───────────┘    └───────────┘    └───────────┘    └───────────┘ 
    

    总结:

    • 当您为head 分配一个值时,您更改了head 所指的内容。这不会影响任何next 参考:节点之间的链接保持不变。当head 是对它的唯一引用时,您可能无法访问第一个节点。在这种情况下,您实际上将列表缩短了一个节点*,因为它现在从 2 开始。

      *(当一个节点变得不可访问时,它不再有任何实际用途。垃圾收集器可能会释放它所占用的内存。)

    • 当您不为head 赋值,而是为head.next = 赋值时,则为head 引用的节点的属性 赋值,并且这会影响列表。这称为变异。另一方面,head 仍将引用节点 1,因为您没有为 head 变量赋值。

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 2013-01-04
      • 2015-02-21
      • 2013-06-13
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多