*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. };

我知道:

  1. &node表示节点变量的地址
  2. node表示存储在名为node
  3. 的地址的值(信息)
  4. *node用于解引用名为node的指针变量。

我的疑惑:

  1. [IMP] 如果我们需要取消引用一个 node 指针来获取它的数据(如第 5 行),那么为什么不在访问其成员元素时也这样做(在第 4 node->next)?
  2. [不是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 变量或值,还是指向结构并不重要,它对所有指针都一样。