Java 与.Net类似,链接列表中的节点引用,以启用O(1)项插入
Net有一个很好的基本链表功能,它允许我保留一个节点引用,可以说是指向链表的“指针”,并使用该引用以O(1)的方式从那里导航和操作链表。也就是说:Java 与.Net类似,链接列表中的节点引用,以启用O(1)项插入,java,linked-list,big-o,Java,Linked List,Big O,Net有一个很好的基本链表功能,它允许我保留一个节点引用,可以说是指向链表的“指针”,并使用该引用以O(1)的方式从那里导航和操作链表。也就是说: LinkedList<string> linkedList = new LinkedList<string>(); LinkedListNode<string> cur = linkedList.First; LinkedListNode<string> rememberThis = null; do
LinkedList<string> linkedList = new LinkedList<string>();
LinkedListNode<string> cur = linkedList.First;
LinkedListNode<string> rememberThis = null;
do
{
if (...)
rememberThis = cur;
} while ((cur = cur.Next) != null);
if (rememberThis != null)
linkedList.AddAfter(rememberThis, "added-value");
LinkedList LinkedList=新建LinkedList();
LinkedListNode cur=linkedList.First;
LinkedListNode rememberThis=null;
做
{
如果(…)
记住这一点=cur;
}while((cur=cur.Next)!=null);
if(rememberThis!=null)
AddAfter(记住这一点,“附加值”);
我没有看到如何在Java中实现同样的功能,即
链接列表中迭代(这当然是O(n)
)
O(1)
插入之后,也要使用该节点引用我遗漏了什么吗?不,不要那样做,那样会坏的。如果您以后在结构上修改了
链接列表
,那么下次移动列表迭代器
的crusor时将抛出一个ConcurrentModificationException
,无法绕过它。这就是所谓的快速失败行为
无论如何,迭代器并不意味着在列表中长时间保留光标。目前,即使对于openjdk 9 ea IIRC,也无法长时间将光标保持在列表中的某个位置,包括LinkedList
s。其背后的原因可能是如何移动现有游标的模糊性。这在许多情况下都很明显,但并不总是如此
毕竟,现在(几乎)不可能将其添加到LinkedList
(Queue
,Deque
,List
)的超级接口中。(这显然是API设计的错误!)您可以创建自己的LinkedList
版本来实现这一点
如果你真的想保留一份推荐信,不知何故。你将不得不用反射来破解内部,这可能根本不值得
我错过什么了吗
否。LinkedList#ListItr类没有书签。因此,在保留前一个节点的同时,不能继续迭代。LinkedList中没有O(1)方法addAfter(Node Node,E element),因为LinkedList#Node是私有的。还有一个add(int索引,E元素),它是O(n)。太悲伤了
解决方法是使用2 ListIterator。一个继续迭代,另一个停在你想记住的位置。然后您可以在最后使用ListIterator#add(ee),即O(1)。但是第一个不能修改列表,否则它将破坏第二个。如果
列表
接口/实现像您描述的那样被破坏,Java世界将无法运行,显然不是这样。查看List.iterator()
,了解如何在Java中使用迭代器。您可以跟踪您遇到的某个元素,然后在以后的某一点上对此采取行动。@TimBiegeleisen查看并没有告诉我有关我的问题的任何信息。你能说得更具体些吗?或者-正如您所说,我将列表
描述为已损坏-也许可以重新阅读我的完整问题?请给出您需要执行的链接列表
无法执行的操作的示例。然后这个问题可能会变得有趣。你能更新一个你想用列表完成的特定任务吗。我觉得Java的List
界面很怪异,来自.NET并不奇怪。不过,该解决方案的性能与1)迭代,2)记住索引3)添加(int-index,E元素)差不多。实际上,add(int-index,E-element)
甚至可以更快一些,因为它不需要维护迭代器。@Eugene Beresovsky同意。我会删除它。