【问题标题】:How does *node copy *next?*node如何复制*next?
【发布时间】:2021-12-05 05:49:14
【问题描述】:

我了解链表的工作原理,但我很难掌握这个特定的代码。

它的this leetcode 问题(基本上我们得到了要删除的节点的地址),其解决方案可以像下面的代码 sn-p 一样实现:

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 表示存储在名为节点的地址中的值(信息)
  3. *node 用于解引用名为 node 的指针变量。

我的疑问:

  1. [IMP] 如果我们需要取消引用 node 指针以获取其数据(如第 5 行),那么为什么不同时访问其成员元素(第 4 行 node->next)?
  2. [Not IMP] 那么*node是如何复制*next的数据的呢?

【问题讨论】:

  • 请不要去这种所谓的“竞赛”或“在线评委”网站学习编程或编程语言。那不是他们的目的。如果您想学习 C++,请投资some good books 并参加适当的课程。学习时应尽量远离此类网站。
  • *node 是什么意思? 这取决于上下文。 ListNode* node 是函数参数的声明。 * 表示指针类型。 *node = *next; 是一个表达式。现在,* 就是indirection operator(可以想象成一种“指针内容运算符”)。 nodenext 是指针。 *next 传递next 的内容。实际上,返回的类型是一个引用(或 const 引用)。因此,左侧的*node 也有效。它提供了将*next 分配到何处的参考。
  • 这个指针语法继承自 C。K&R 是故意这样做的。我记得读过他们认为* 可以出现在声明和表达式中的相同位置是一件好事。他们可能忽略(或忽略)了这样一个事实,即学习者可能根本不知道* 具有不同的含义。 (更不用说,还有一个二元运算符 * 用于乘法 - 在其他语言中也是如此。)
  • @Scheff'sCat 感谢您的解释。我只是忘了提到我知道间接/取消引用运算符。我实际上对我的怀疑不感到困惑。 1(请检查已编辑的问题)

标签: c++ pointers linked-list


【解决方案1】:

*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 是浅拷贝。
【解决方案2】:

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 并消除了我的疑虑
猜你喜欢
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2013-12-20
  • 2013-02-12
  • 2021-10-05
  • 2021-10-24
相关资源
最近更新 更多