【发布时间】: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. };
我知道:
-
&node表示节点变量的地址 -
node表示存储在名为节点的地址中的值(信息) -
*node用于解引用名为 node 的指针变量。
我的疑问:
- [IMP] 如果我们需要取消引用
node指针以获取其数据(如第 5 行),那么为什么不同时访问其成员元素(第 4 行node->next)? - [Not IMP] 那么
*node是如何复制*next的数据的呢?
【问题讨论】:
-
请不要去这种所谓的“竞赛”或“在线评委”网站学习编程或编程语言。那不是他们的目的。如果您想学习 C++,请投资some good books 并参加适当的课程。学习时应尽量远离此类网站。
-
*node 是什么意思? 这取决于上下文。
ListNode* node是函数参数的声明。*表示指针类型。*node = *next;是一个表达式。现在,*就是indirection operator(可以想象成一种“指针内容运算符”)。node和next是指针。*next传递next的内容。实际上,返回的类型是一个引用(或 const 引用)。因此,左侧的*node也有效。它提供了将*next分配到何处的参考。 -
这个指针语法继承自 C。K&R 是故意这样做的。我记得读过他们认为
*可以出现在声明和表达式中的相同位置是一件好事。他们可能忽略(或忽略)了这样一个事实,即学习者可能根本不知道*具有不同的含义。 (更不用说,还有一个二元运算符 * 用于乘法 - 在其他语言中也是如此。) -
@Scheff'sCat 感谢您的解释。我只是忘了提到我知道间接/取消引用运算符。我实际上对我的怀疑不感到困惑。 1(请检查已编辑的问题)
标签: c++ pointers linked-list