当前位置: 首页 > 面试题库 >

指向Java LinkedList节点的指针

岳嘉良
2023-03-14
问题内容

我正在LinkedListO(1)将n个条目推入Java 。
我想在以后的O(1)删除一些独特的项目。
我虽然要保留指向“”的唯一节点的数组,LinkedList以便稍后再删除它们。
有没有办法在LinkedList其他任何Java类上执行此操作?
我尝试将迭代器存储到项目。这样我就可以使用iter.remove()。但我知道当时列表上只能有一个迭代器。

我知道一个简单的解决方案可以自己实现链接列表。但是我宁愿使用LinkedList或已经实施的其他一些Java类。


问题答案:

Java List实现不提供O(1)removes
*的性能。使用迭代器,您必须遍历索引(O(n)),使用遍历ArrayList后移(O(n)),即使它LinkedList是双向链接列表,也不会在其中公开节点您只需简单地重新分配下一个/最后一个引用就可以直接删除它们的列表-
需要遍历才能找到要删除的节点(O(n))。

您可以编写自己的代码MyDoublyLinkedList<MyNode<T>>,公开节点而不是其中包含的值,如果保留对节点的引用,则可以删除O(1)。索引当然是O(n)以便按索引从列表中获取内容。根据您的使用模式,这可能是一个可行的设计选择。

简而言之,如果您要使用Java提供的数据结构,请使用提供该性能的数据结构:

如果排序不重要并且没有重复的项目,请使用HashSet(但是请注意,这根本不允许直接索引)

否则,重新编写代码以使用Map实现可能是最好的选择。

[*] LinkedListDeque实现为O(1)用于去除头/尾。

编辑以添加评论:

如上所述,没有,没有O(1)时间复杂度删除操作。

原因 是,除了在最极端的情况下,它是无关紧要的。

在我5岁的3Ghz台式机上LinkedList,通过索引(即index = length / 2)对100,000个条目的a
进行最坏情况的O(n)移除需要0.2ms(第二点)。

如果将此盒中的Windows内存管理到1,000,000个条目,由于该窗口上的Windows内存管理,我开始进入Windows交换磁盘I / O。

简而言之,您正在尝试解决大多数情况下不存在的问题。通常称为“过早优化”



 类似资料:
  • 我正在制作一个方法,将一个节点添加到名为“publicvoidadd(int-index,T-value)”的列表中。 此方法将把一个值放入索引中,然后将有指向列表中下一个和上一个元素的指针。我把指向前面节点的指针搞砸了,我一直坐在那里进行实验,但没有让它工作。 示例:我们有一个包含整数值[2,4,6]实例变量的列表:Node head、tail;整数金额,变动; 内部类的实例变量为:T值;节点p

  • 在下面给出的代码中,我声明了一个指向int的指针,我们都知道memcpy返回一个指向目标字符串的空指针,所以如果ptr是指向int的指针,那么为什么printf(“%s”,ptr);是完全有效的,ptr毕竟不是指向char的指针。

  • 指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针,我们就称它为 二级指针,或者 指向指针的指针。 假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示: 将这种关系转换为C语言代码: 指针变

  • 问题内容: 将一些地图定义为: 我想要一个指向地图地址的变量(不要复制所有变量)。我尝试使用: 但在使用时,它显示 内部编译器错误:无类型的var,初始化:new 如何获得? 编辑 该错误由另一个问题显示。 问题答案: 映射是引用类型,因此它们总是通过引用传递。您不需要指针。转到文档

  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p

  • 本文向大家介绍什么是指向指针的指针? 相关面试题,主要包含被问及什么是指向指针的指针? 时的应答技巧和注意事项,需要的朋友参考一下 指针指向的变量是一个指针,即具体内容为一个指针的值,是一个地址. 此时指针指向的变量长度也是4位.