从双链表中删除重复项

时间:2011-05-04 18:34:15

标签: c++ algorithm linked-list

您好 我偶然发现了一些问题 你给出了未分类的双链表。你应该从双链表中找到并删除重复项。

以最低算法复杂度执行此操作的最佳方法是什么?

谢谢。

4 个答案:

答案 0 :(得分:7)

如果空间很大并且你必须随着时间的推移真正优化它,也许你可以使用Hashset(或C ++中的等价物)。您阅读每个元素并将其推送到哈希集。如果hashset报告重复,则表示存在重复。您只需删除该节点。

复杂性为O(n)

答案 1 :(得分:4)

将其视为两个单链表而不是一个双向链表,其中一组链接首先持续,另一组首先持续到第一。您可以使用合并排序对第二个列表进行排序,该排序将为O(n log n)。现在使用第一个链接遍历列表。对于每个节点,检查是否(node.back)->key==node.key,如果是,请从列表中删除它。在此遍历期间恢复后退指针,以便再次正确地双重链接列表。

这不一定是最快的方法,但它不会占用任何额外的空间。

答案 2 :(得分:3)

假设潜在雇主相信C ++库:

// untested O(n*log(n))
temlate <class T>
void DeDup(std::list<T>& l) {
    std::set<T> s(l.begin(), l.end());
    std::list<T>(s.begin(), s.end()).swap(l);
}

答案 3 :(得分:0)

复杂度最低?只需遍历列表X次(其中X是项目数),从头部开始,然后在列表中删除(并重新分配指针)。 O(n log n)(我相信)时间更糟糕的情况下,真的很容易编码。