Java 与.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

Net有一个很好的基本链表功能,它允许我保留一个节点引用,可以说是指向链表的“指针”,并使用该引用以O(1)的方式从那里导航和操作链表。也就是说:

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)
    插入之后,也要使用该节点引用
  • Java对a不起作用,它允许我围绕我所在的项目对列表进行操作,但我似乎无法在保留前一个节点的同时进行迭代


    我遗漏了什么吗?

    不,不要那样做,那样会坏的。如果您以后在结构上修改了
    链接列表
    ,那么下次移动
    列表迭代器
    的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同意。我会删除它。