我的列表项目:
typdef struct sNode
{
struct sNode* next;
myData data;
} tNode;
我希望实现以下API:
bool removeNode(tNode* node)
{
... // need to fix list and free node
}
问题是我没有要修改的前一个元素。 是否有某种神奇的解决方法?
答案 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
的额外费用。
如果经常通过指针删除节点,则应考虑单链表是否是正确的数据结构。例如,双向链表没有这个问题(但每个节点有一个额外指针的额外开销)。