编写一个函数以删除单链接列表中的节点(尾部除外),只允许访问该节点

时间:2018-10-16 15:00:10

标签: c++ memory-management linked-list

struct ListNode {
      int val;
      ListNode *next;
      ListNode(int x) : val(x), next(NULL) {}
};

void deleteNode(ListNode* node) { 
        *(node) = *(node->next);
}

我知道这将是结果

node = 3
deleteNode(节点)
1-> 2-> 3-> 4-> 5
1-> 2-> 4-> 5

但是这将导致内存泄漏的地方,指针将指向新节点,但是int变量3仍会在内存中的某个位置浮动吗?谢谢!

2 个答案:

答案 0 :(得分:1)

  

但这会导致内存泄漏

是的

  

但是int变量3仍会在内存中的某个位置浮动吗?

不。包含4的节点是泄漏的节点,因为它是包含3的节点被覆盖了,也就是指向4的节点。结果将是这样的:

      4  <--- this is the node which was leaked (since nothing points to it)
       \
        ->5
       /
1->2->4  <--- this is the node that used to contain 3

答案 1 :(得分:0)

不可能摆脱节点中没有指向其前任节点的指针的情况。

您可以做的是将->data->nextnode->next移到node并摆脱node->next。它将几乎与请求的内容相同-删除存储在node->data中的数据,并使列表更短一个元素。

步骤:

  1. 处置node->data
  2. 将指针保存到要处置的节点tmp = node->next
  3. 将下一个节点状态复制到当前节点node->next = tmp->next; node->data = tmp->data
  4. 处置tmp

和代码(尚未尝试编译):

node->val = 42; // dispose of node own data (not required for RAII fields)
ListNode* tmp = node->next;
*(node) = *(node->next);
delete tmp;