问题: 你在链表中间的某个地方有一个节点,你需要删除该节点。 您不会获得链表的头节点。 条件:给定节点旁边至少有一个节点。
节点的结构:
struct Node {
int data;
struct Node *next;
Node(int x) {
data = x;
next = NULL;
}
}*head;
我的解决方案:
Node* temp=node->next;
node->data=node->next->data;
node->next=node->next->next;
delete temp;
另一个解决方案(我不明白(:
Node *temp = node->next;
*node = *(node->next);
delete temp;
两者都给出了正确的结果,但我不明白后一种解决方案的第二行。
结构Node
具有默认的复制赋值,因为它和移动赋值都没有声明。
因此,*node = *(node->next);
将两个属性(data
和next
(从*(node->next)
复制到*node
(*node).data = (*(node->next)).data
(*node).next = (*(node->next)).next
第二种解决方案与第一种解决方案相同,只是它使用类的赋值运算符,而不是单独赋值成员。
所以你的意思是在第二个解决方案中,数据成员也被复制了(就像在第一个解决方案中一样(?
是的,这就是类的复制赋值运算符所做的。
请参阅不理解这一行.. *node = *(node->next(; 所以你能详细说明/解释这一行吗?
*node
通过指向Node
类型的对象的指针node
间接。结果是Node
的左值。
*(node->next)
首先通过指针node
间接访问其成员next
该成员是指向另一个类型为Node
的对象。另一个指针也是间接通过的,这导致左值指向另一个Node
。
最后,赋值运算符将第一个Node
分配给另一个Node
。类的复制赋值运算符将每个成员从右侧操作数复制到左侧操作数的相应成员。