从双向链表中删除重复项
Delete duplicates from Doubly linked list
Hello我磕磕绊绊地回答了以下问题你给出了未排序的双链表。您应该从双向链表中找到并删除重复项。
以最小的算法复杂性做到这一点的最佳方法是什么?
谢谢。
如果空间充足,并且您必须随着时间的推移真正优化它,也许您可以使用Hashset
(或C++中的等效物)。您读取每个元素并将其推送到哈希集。如果哈希集报告重复,则表示存在重复。您只需删除该节点即可。
复杂性是O(n)
把它想象成两个单链表,而不是一个双向链表,一组链接从头到尾,另一组从最后到第一。您可以使用合并排序对第二个列表进行排序,该排序将是 O(n log n)。现在使用第一个链接遍历列表。对于每个节点,检查是否(node.back)->key==node.key
,如果是,请将其从列表中删除。在此遍历期间恢复后退指针,以便再次正确双链接列表。
这不一定是最快的方法,但它不会占用任何额外的空间。
假设潜在雇主相信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);
}
复杂性最小?只需从头部开始遍历列表最多 X 次(其中 X 是项目数),然后删除(并重新分配指针)列表。O(n log n)(我相信)时间在更糟糕的情况下,而且真的很容易编码。
相关文章:
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 如何实现容纳整数和无效指针的双向链表?
- 为什么我的双向链表删除函数会删除多个节点?
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 双向链表 - 无法删除第一个节点
- 双向链表 std::unique_ptr 类在节点删除时无法按预期工作
- 在双向链表中给定节点之后删除节点
- 尝试删除所选节点的双向链表
- 双向链表问题(特别是复制构造函数和删除函数)
- 使用类从双向链表中删除节点
- 从双向链表末尾删除节点时出现分段错误
- 删除双向链表 (C++) 中的节点
- 双向链表删除C++中的偶数
- 删除双向链表 (C++) 的最后一个节点
- 删除循环双向链表中的节点
- 如何删除双向链表中与特定值匹配的所有项目
- 我不能删除双向链表中的最小数字,然后删除下一个
- 删除双向链表中的节点
- 是否有删除半个双向链表边缘的名称
- 从双向链表中删除重复项