【发布时间】:2021-02-04 15:43:17
【问题描述】:
假设我有一个如下所示的链表节点:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
目标是编写一个函数来删除单链表中的一个节点。一种在恒定时间内执行此操作的有效方法是这样的:
void deleteNode(ListNode* node) {
auto *tmp = node->next;
*node = *tmp;
delete tmp;
}
这可行,但为什么我们需要取消引用指针?
如果node 是指针,tmp 是指针,为什么需要取消引用?为什么我不能node = tmp?
【问题讨论】:
-
分配给函数的(非引用)参数在函数外部无效。指针没有什么特别之处。
-
如果我理解正确,那么您实际上是在删除 tmp 之前将 tmp_node 复制到当前节点。
-
如果
*node = *tmp复制了值,我如何才能移动node的地址(没有任何副本)? -
“一种有效的方法”我对此表示怀疑。复制指向的对象而不是操作指针仅在具有非复杂赋值运算符的非常小的对象的情况下才有效...使用指向要删除的节点 preceeding 的指针,事情将是效率更高。请解释为什么这不是一个选项。
-
@Adrian C++ 中一个不可变的绝对规则,在任何情况下都不能改变对象的地址。
标签: c++ pointers dereference