【发布时间】:2013-12-25 12:49:38
【问题描述】:
我有一个算法,我以某种方式通过图中的节点,偶尔通过同一个节点几次,我需要形成一个通过节点的列表,这样一个节点最后出现一次我过去的时间。
例如,如果我通过节点A -> B -> C -> A -> C,我最终需要的列表是[B, A, C]。
我想做的是使用 LinkedList,这样图表中的每个节点都将包含对其在 LinkedList 中的节点的引用。那么,每经过一个节点,我都会将其对应的节点从LinkedList中取出,重新插入到LinkedList的末尾,操作的复杂度只会是O(1)。
但是,当我开始实现它时,我遇到了一个问题:显然,Java 类 LinkedList 不允许我看到它的实际列表节点。使用 LinkedList 的常规删除函数来删除包含给定图形节点的列表节点将是 O(n) 而不是 O(1),否定了使用 LinkedList 的全部意义。
当然,我可以自己实现 LinkedList,但我宁愿避免这样做 - 在我看来,如果我必须在 java 中实现 LinkedList,我做错了。
那么,有没有办法解决这个问题,而无需我自己实现 LinkedList?有什么我遗漏的吗?
【问题讨论】:
-
你是对的,API 在这一点上很糟糕。 LinkedList 的内部工作是不公开的,甚至在时间上也不是恒定的。 LinkedList 中的 Node 类的名称已经随着时间的推移而更改。我想您唯一的选择是创建自己的课程。您可以复制粘贴 LinkedList 源代码并根据需要进行修改。
-
问题是,你应该如何在重新插入时从列表中找到元素?
-
每个图节点都持有对其列表节点的引用。当我通过图形节点时,我使用这个引用从列表中删除节点,然后将图形节点插入到列表的末尾(并将引用保存到新的列表节点,插入到末尾的那个列表)。
-
@Sage 如果你写出你的 cmets 作为答案,我会感谢你帮助我......
-
@Nayish,对不起,实际上我认为您是对的,我应该将其发布为将来可能搜索的人的答案。谢谢你:)
标签: java performance collections linked-list