*node如何复制*next?
How does *node copy *next?
我了解链表的工作原理,但这段代码对我来说很难掌握。
它的 this leetcode 问题(基本上我们给出了要删除的节点的地址)其解决方案可以像下面的代码片段一样实现:
1. class Solution {
2. public:
3. void deleteNode(ListNode* node) {
4. ListNode* next = node->next;
5. *node = *next;
6. delete next;
7. }
8. };
我知道:
&node
表示节点变量的地址
node
表示存储在名为node 的地址的值(信息)
*node
用于解引用名为node的指针变量。
我的疑惑:
- [IMP] 如果我们需要取消引用一个
node
指针来获取它的数据(如第 5 行),那么为什么不在访问其成员元素时也这样做(在第 4 node->next
)?
- [不是IMP]那么,
*node
如何复制*next
的数据呢?
*node
是传入参数的实体,包括节点值和下一个地址。 *node = *next
是浅拷贝。如果ListNode比较复杂,浅拷贝可能会带来一些问题。推荐深拷贝。
ListNode
在这里:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
这种方式比较好理解:
class Solution {
public:
void deleteNode(ListNode* node) {
ListNode* next = node->next;
node->val = next->val;
node->next = next->next;
delete next;
}
};
node->next
其实等价于(*node).next
。所以那里已经有一个隐式的取消引用。
至于复制,我假设你理解例如之间的分配。普通 int
变量?如:
int a = 5;
int b = 10;
a = b;
b
的值很自然会被复制到a
。
现在让我们再次做同样的事情,但是有一个指针指向 b
:
int a = 5;
int b = 10;
int* pb = &b; // pb is pointing to b
a = *pb;
这真的和a = b
一模一样。
还有另一个指向 a
的例子:
int a = 5;
int b = 10;
int* pa = &a; // pa is pointing to a
*pa = b;
同样,这与 a = b
相同。
现在把它们放在一起:
int a = 5;
int b = 10;
int* pa = &a; // pa is pointing to a
int* pb = &b; // pb is pointing to b
*pa = *pb;
还是和a = b
一样。
指针是指向普通 int
变量或值,还是指向结构并不重要,它对所有指针都一样。
我了解链表的工作原理,但这段代码对我来说很难掌握。
它的 this leetcode 问题(基本上我们给出了要删除的节点的地址)其解决方案可以像下面的代码片段一样实现:
1. class Solution {
2. public:
3. void deleteNode(ListNode* node) {
4. ListNode* next = node->next;
5. *node = *next;
6. delete next;
7. }
8. };
我知道:
&node
表示节点变量的地址node
表示存储在名为node 的地址的值(信息)
*node
用于解引用名为node的指针变量。
我的疑惑:
- [IMP] 如果我们需要取消引用一个
node
指针来获取它的数据(如第 5 行),那么为什么不在访问其成员元素时也这样做(在第 4node->next
)? - [不是IMP]那么,
*node
如何复制*next
的数据呢?
*node
是传入参数的实体,包括节点值和下一个地址。 *node = *next
是浅拷贝。如果ListNode比较复杂,浅拷贝可能会带来一些问题。推荐深拷贝。
ListNode
在这里:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
这种方式比较好理解:
class Solution {
public:
void deleteNode(ListNode* node) {
ListNode* next = node->next;
node->val = next->val;
node->next = next->next;
delete next;
}
};
node->next
其实等价于(*node).next
。所以那里已经有一个隐式的取消引用。
至于复制,我假设你理解例如之间的分配。普通 int
变量?如:
int a = 5;
int b = 10;
a = b;
b
的值很自然会被复制到a
。
现在让我们再次做同样的事情,但是有一个指针指向 b
:
int a = 5;
int b = 10;
int* pb = &b; // pb is pointing to b
a = *pb;
这真的和a = b
一模一样。
还有另一个指向 a
的例子:
int a = 5;
int b = 10;
int* pa = &a; // pa is pointing to a
*pa = b;
同样,这与 a = b
相同。
现在把它们放在一起:
int a = 5;
int b = 10;
int* pa = &a; // pa is pointing to a
int* pb = &b; // pb is pointing to b
*pa = *pb;
还是和a = b
一样。
指针是指向普通 int
变量或值,还是指向结构并不重要,它对所有指针都一样。