【问题标题】:What does head.next actually mean in linked lists?head.next 在链表中的实际含义是什么?
【发布时间】:2021-10-07 11:05:43
【问题描述】:
我创建了一个带有Node 类的链接列表,该类具有Node next 和int data。
head.next 是什么意思?我很困惑。
考虑这个列表:1 > 2 > 3 > 4,1 是头部。
现在如果我执行head=head.next,head 现在指向 2。但是当我执行 head.next=null 时,1 指向 null。有人可以解释为什么会这样吗?
【问题讨论】:
标签:
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.next,head 现在指向 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 变量赋值。