Java Arraylist到linkedlist节点的映射

Java Arraylist到linkedlist节点的映射,java,arraylist,linked-list,Java,Arraylist,Linked List,我希望能够在O1时间内访问我的双链接列表中的某个节点。我知道,如果我遍历列表以找到某个节点,这将需要很长时间,因此我希望将节点映射到一个数组列表,在该列表中我可以在O1时间内访问节点 我真的不确定我将如何做这个映射。我想看看如何做到这一点的例子 编辑: 我希望能够访问链接列表中的任何节点,以便在O1时间内移动节点 示例:在O1时间内将ID为5的节点移动到列表末尾 编辑2:我上传了一张我想要完成的图片示例 我不完全确定您的目的,您只是想在O1中检索对象的索引吗 这就是它的样子: LinkedLis

我希望能够在O1时间内访问我的双链接列表中的某个节点。我知道,如果我遍历列表以找到某个节点,这将需要很长时间,因此我希望将节点映射到一个数组列表,在该列表中我可以在O1时间内访问节点

我真的不确定我将如何做这个映射。我想看看如何做到这一点的例子

编辑: 我希望能够访问链接列表中的任何节点,以便在O1时间内移动节点

示例:在O1时间内将ID为5的节点移动到列表末尾

编辑2:我上传了一张我想要完成的图片示例


我不完全确定您的目的,您只是想在O1中检索对象的索引吗

这就是它的样子:

LinkedList<Object> aList; // your LinkedList
Map<Object, Integer> mapper = new HashMap<Object, Integer>();
Object[] arr = aList.toArray();
for( int i = 0; i < arr.length; i++ ){
    mapper.put( arr[i], i );
}
================================

回复:你的编辑

你不能,或者我不知道。实际上,您需要的是最佳的链接列表和数组。

使用toArray方法将您的链接列表转换为数组,以便进行固定时间检索:


:提供O1时间,键按双链表顺序排列。

内置数据结构ArrayList和LinkedList无法执行此操作

总的来说,这两者都不可能同时存在

O1按列表中的位置索引 O1删除/添加/移动列表中的任意位置。 可能性:

如果使用基于树的结构,则可以对这两种类型都使用OlogN。 您可以使用基于数组的结构对O1进行索引,但随后在中间移除/添加。 您可以在O1中使用类似哈希映射的结构进行添加/删除,但它只允许O1通过键进行访问,不允许通过除迭代之外的索引进行访问,即On。这意味着,如果在中间添加或删除一些东西,则索引不会更改。 即使您尝试将链表与数组相结合,也会出现删除/添加的问题,因为您仍然需要更新数组

好的,通过添加图像来显示所需内容,这是可行的。实际上,您正在重新实现类似LinkedHashMap的东西,但只使用连续的整数键,并且能够操作链接的部分

如果链接列表由节点对象组成,则会有一个ArrayList

向链表中添加新节点时,只能向ArrayList中添加元素,否则只能将ArrayList用于查找

以下是一个例子:

class FastIndexLinkedIntList<X> {
   class Node {
      Node next;
      Node prev;
      int key;
      X value;
      Node(int key, X val) { this.key = key; this.value = val; }
   }

   ArrayList<Node> indexedNodes = new ArrayList<Node>();
   Node head;
   Node tail;


   public void add(X value) {
      int key = indexedNodes.size();
      Node node = new Node(key, value);
      insertAtEnd(node);
      indexedNodes.add(node);
   }

   private void insertAtEnd(Node n) {
      if(tail == null) {
         assert head == null;
         head = n;
         tail = n;
         return;
      }
      n.prev = tail;
      n.next = null;
      tail.next = n;
      tail = n;
   }

   private void removeNode(Node n) {
      if(n.next == null) {
         assert n == tail;  // last node

         tail = n.prev;
         tail.next = null;
      }
      else {
         n.next.prev = n.prev;
      }

      if(n.prev == null) {
         assert n == head; // first node

         head = n.next;
         head.prev = null;
      }
      else {
         n.prev.next = n.next;
      }
   }

   public void moveNodeToEnd(int key) {
      Node n = indexedNodes.get(key);
      removeNode(n);
      insertAtEnd(n);
   }

}
您可能希望在此处添加更多操作,但对于问题中的示例来说,这些操作已经足够了:

FastIndexedLinkedList<String> ll = new FastIndexedLinkedList<String>();
ll.add("0");
ll.add("1");
ll.add("2");
ll.add("3");
ll.moveNodeToEnd(2);

我的目标不仅是获得O1时间,而且还要了解如何将arraylist中的索引链接到链接列表中的节点,并通过arraylist检索该节点。我只使用内置arraylist,而使用自己的双链接列表。此外,我不想让arraylist只在链接列表中保持有序。LinkedList中的节点将是Integer类型,并且将等于arraylist中的索引。因此,get方法就足够了,并且是O1次。我只是不完全理解如何在Java中实现arraylist和linkedlist之间的链接。@DomX23:我认为这不是一个真正的问题。我在回答中加了一个例子。
FastIndexedLinkedList<String> ll = new FastIndexedLinkedList<String>();
ll.add("0");
ll.add("1");
ll.add("2");
ll.add("3");
ll.moveNodeToEnd(2);