没有头指针的删除

delete without a head pointer

问题: 在链表中间某处给定了某个节点,您需要删除该节点。 您没有获得链表的头节点。 条件:给定的节点旁边至少有一个节点。

节点结构:

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;

两者都给出了正确的结果,但我不理解后一个解决方案的第二行。

第二种解决方案与第一种相同,只是它使用了class的赋值运算符,而不是单独分配成员。

so you mean in the 2nd solution too the data member gets copied(like in the 1st one)?

是的,这就是 class 的复制赋值运算符所做的。

see don't understand this line.. *node = *(node->next); so can you elaborate/explain this line.

*node 通过指针 node 间接指向类型 Node 的对象。结果是 Node.

的左值

*(node->next) 首先通过指针 node 间接访问它的成员 next,它是指向另一个类型 Node 的对象的指针。这个 other 指针也是间接通过的,这导致左值指向另一个 Node.

最后,赋值运算符将第一个Node赋值给另一个Node。 class 的复制赋值运算符将每个成员从右手操作数复制到左手操作数的相应成员。

结构 Node 有一个默认的复制赋值,因为它和移动赋值都没有声明。

因此 *node = *(node->next); 将两个属性(datanext)从 *(node->next) 复制到 *node 使其完全相同:

(*node).data = (*(node->next)).data
(*node).next = (*(node->next)).next