链表的应用

时间:2013-09-14 11:57:03

标签: data-structures language-agnostic linked-list

链接列表应用的一些好例子是什么?我知道将队列和堆栈实现为链接列表是一个好主意,但是是否有一个实际的直接示例链接列表解决了一个特别利用快速插入时间的问题?不仅仅是基于链表的其他数据结构。

希望获得类似于关于优先级队列的问题的答案:Priority Queue applications

我自己找到了一个:使用哈希表和链表实现的LRU(最近最少使用的)缓存。

还有Exception类的示例InnerExeption

还有什么?

3 个答案:

答案 0 :(得分:4)

我在美国的“大型股票市场”担任开发人员。使我们以非常快的速度运行的部分原因是我们在初始化之后(在市场上的一天开始之前)不进行任何堆分配/解除分配。这种技术并不是交换所独有的,在大多数实时系统中也很常见。

首先,对我们来说,链接列表比基于数组的列表更受欢迎,因为它们在列表增长或缩小时不需要堆分配。我们在交易所的多个应用程序中使用链表。

  • 一个应用程序是在初始化期间将所有对象预先分配到池(链接列表)中;所以每当我们需要一个新对象时,我们就可以删除列表的头部。
  • 另一个应用是订单处理;每个Order对象都实现一个链接列表条目接口(具有上一个和下一个引用),因此当我们从客户收到订单时,我们可以从池中删除Order对象并将其放入“处理”列表中。由于每个Order对象都实现了一个Linked List条目,因此在列表中的任何位置添加就像填充上一个和下一个引用一样简单。

离我头顶的例子:

Interface IMultiListEntry {

    public IMultiListEntry getPrev(MultiList list);
    public void setPrev(MultiList list, IMultiListEntry entry);

    public IMultiListEntry getNext(MultiList list);
    public void setNext(MultiList list, IMultiListEntry entry);

}

Class MultiListEntry implements IMultiListEntry {

    private MultiListEntry[] prev = new MultiListEntry[MultiList.MAX_LISTS];
    private MultiListEntry[] next = new MultiListEntry[MultiList.MAX_LISTS];

    public MultiListEntry getPrev(MultiList list) {
        return prev[list.number];
    }
    public void setPrev(MultiList list, IMultiListEntry entry) {
        prev[list.number] = entry;
    }

    public IMultiListEntry getNext(MultiList list) {
        return next[list.number];
    }
    public void setNext(MultiList list, IMultiListEntry entry) {
        next[list.number] = entry;
    }

}

Class MultiList {

    private static int MAX_LISTS = 3;
    private static int LISTS = 0;

    public final int number = LISTS++;

    private IMultiListEntry head = null;
    private IMultiListEntry tail = null;

    public IMultiListEntry getHead() {
        return head;
    }

    public void add(IMultiListEntry entry) {
        if (head==null) {
            head = entry;
        } else {
            entry.setPrevious(this, tail);
            tail.setNext(this, entry);
        }
        tail = entry;
    }

    public IMultiListEntry getPrev(IMultiListEntry entry) {
        return entry.getPrev(this);
    }
    public IMultiListEntry getNext(IMultiListEntry entry) {
        return entry.getNext(this);
    }
}

现在你所要做的就是扩展MultiListEntry或实现IMultiListEntry,并将接口方法委托给MultiListEntry对象的内部引用。

答案 1 :(得分:0)

答案可能是无限多的,“好的例子”是一个主观的术语,所以你的问题的答案是值得商榷的。当然有例子。您只需要考虑快速插入的可能需求。

例如,您有一个任务列表,您必须解决所有任务。当您浏览列表时,当任务解决时,您意识到必须紧急解决新任务,以便在刚刚解决的任务之后插入任务。它不是队列,因为将来可能需要列表进行审核,因此您需要保持列表完整,在这种情况下不允许使用pop方法。

再举一个例子:你有一组按字母顺序排序的名字。让我们假设您可以以某种方式快速确定下一个指向存储特定名称的对象的对象。如果要快速删除名称,只需转到要删除的对象的上一项。删除也比堆栈或队列更快。

最后,想象一下即使在插入或删除后也需要存储的大量项目。在这种情况下,只需搜索要删除的项目或项目插入位置之前的项目然后执行操作比复制整个大型集合要快得多。

答案 2 :(得分:0)

java中的hashmaps使用链接列表表示。 当同一个地方有多个键哈希时,会导致冲突,此时键被链接到链接列表中。