Arrays 没有动态内存分配的LinkedList

Arrays 没有动态内存分配的LinkedList,arrays,algorithm,data-structures,static,Arrays,Algorithm,Data Structures,Static,假设我们使用的开发环境没有动态内存(只有具有固定边界的静态数组)。如何实现列表(或ArrayList)。 好吧,当我试图向一个完整的数组添加元素时,我有一个想法,就是创建一个更大的新数组,但我希望有更有效的方法。 另外,我不是在要求实现,我是在要求想法:)你可以查看Sedgewick关于动态数组和调整其大小的文档。您可以在中看到总体思路,在中可以看到更详细的定义 还有一个样本 尽管此示例用于队列,但您也可以将此机制用于LinkedList。 在这个样本中,当尺寸达到极限时,他将尺寸加倍 publ

假设我们使用的开发环境没有动态内存(只有具有固定边界的静态数组)。如何实现列表(或ArrayList)。 好吧,当我试图向一个完整的数组添加元素时,我有一个想法,就是创建一个更大的新数组,但我希望有更有效的方法。
另外,我不是在要求实现,我是在要求想法:)

你可以查看Sedgewick关于动态数组和调整其大小的文档。您可以在中看到总体思路,在中可以看到更详细的定义 还有一个样本

尽管此示例用于队列,但您也可以将此机制用于LinkedList。 在这个样本中,当尺寸达到极限时,他将尺寸加倍

public void enqueue(Item item) {
        // double size of array if necessary and recopy to front of array
        if (N == q.length) resize(2*q.length);   // double size of array if necessary
        q[last++] = item;                        // add item
        if (last == q.length) last = 0;          // wrap-around
        N++;
    }
当限制降低到数组的四分之一时,他将数组减半

 public Item dequeue() {
        if (isEmpty()) throw new NoSuchElementException("Queue underflow");
        Item item = q[first];
        q[first] = null;                            // to avoid loitering
        N--;
        first++;
        if (first == q.length) first = 0;           // wrap-around
        // shrink size of array if necessary
        if (N > 0 && N == q.length/4) resize(q.length/2); 
        return item;
    }

一个常见的技巧是在列表已满时重新创建列表。不仅仅是一个因素,而是很多因素,对规模增长的预期。这样,如果达到上限,您将只对性能产生很小的影响。。。哦,等等。。。这就是您建议的:-)另一种方法是为所有可能的类型创建一个容器,并为该容器(或一对)创建最大的可能列表。然后,您将能够从该大数组创建子列表,并且该类型在该容器中定义。有点像旧的
变体
()容器。它会让你的速度超过内存,但通常这是不值得的。