从列表中删除对象

时间:2011-05-13 16:32:08

标签: c generic-list

我的列表项目:

typdef struct sNode
{
   struct sNode* next;
   myData data;
} tNode;

我希望实现以下API:

bool removeNode(tNode* node)
{
... // need to fix list and free node
}

问题是我没有要修改的前一个元素。 是否有某种神奇的解决方法?

3 个答案:

答案 0 :(得分:4)

没有。您必须从列表的开头遍历才能找到前一个节点,这是非常低效的。这是单链表的问题。如果您需要快速,请使用双向链表(每个节点都有 next previous 指针)。

答案 1 :(得分:1)

您正在使用单个链接列表,如果要从列表中删除节点,则应从头部遍历列表。因此,您需要将API更改为以下内容:

bool removeNode(tNode * head, tNode* node);

答案 2 :(得分:-1)

是(差不多) - 您可以将node->next的内容复制到node,然后删除node->next

在伪代码中:

sNode* next = node->next; // see below for an important special case
node->data = next->data;
node->next = next->next;
free(next);

我说“差不多”的原因是,如果node没有后继,这不起作用。在这种情况下,您必须从头开始遍历列表。

此外,您还必须考虑复制data的额外费用。

如果经常通过指针删除节点,则应考虑单链表是否是正确的数据结构。例如,双向链表没有这个问题(但每个节点有一个额外指针的额外开销)。