单链表和双链表之间是否存在性能差异?

时间:2011-02-24 01:07:04

标签: java data-structures

我们的家庭作业要求我们证明Java LinkedList实现是双重链接而不是单链接。但是,列表操作(如添加元素,删除元素和查找元素)似乎对两个实现都具有相同的复杂性,因此似乎没有办法使用性能参数来演示Java的双重链接特性。 LinkedList。有谁知道更好的方式来说明两者之间的差异?

4 个答案:

答案 0 :(得分:2)

查看向前或向后迭代,删除“before-last”元素,等等。

答案 1 :(得分:2)

这是一个非常简单的证明 - 您查看源代码并看到每个节点都有一个.previous指针:) http://www.docjar.com/html/api/java/util/LinkedList.java.html

答案 2 :(得分:0)

考虑以下节点,单个和双重。

class SingleLinkedNode {     E数据;     SingleLinkedNode接下来; }

class DoubleLinkedNode {     E数据;     DoubleLinkedNode prev;     DoubleLinkedNode接下来; }

如果我们想从DoubleLinkedList中删除(假设我们已经找到了节点,这是非常不同的)我们需要做什么?

  1. 在删除之前创建节点 一分指向后一个。
  2. 使删除的节点之后的节点指向之前的节点。
  3. 如果我们想要从SingleLinkedList中删除(假设我们已经找到了节点,这是非常不同的)我们需要做什么?

    1. 使删除的节点之前的节点指向之后的节点。
    2. 你认为这意味着它在单个链表中比在双重列表中更快。

      但是,如果我们之前没有对该节点的引用,我们如何删除该节点呢?我们只提到了下一个。难道我们不必在列表上进行其他搜索才能找到上一个吗? :-O

答案 3 :(得分:0)

Java List接口没有允许您在不搜索链接列表的情况下删除项目的方法。它有remove(int index),它必须扫描列表才能找到索引条目,它还有remove(Object o),它也必须扫描列表。由于链接列表实现可以在扫描时保存必要的先前项目条目上下文,因此删除对于单链接和双链接列表具有相同的复杂性。此状态也可以保存在迭代器中,因此Iterator.remove()不会更改它。所以我认为你不能从删除性能中得知。

我的猜测是,对此的“正确”答案是创建几个不同大小的列表,并在搜索第一个或最后一个对象时计算.indexOf()和.lastIndexOf()的性能。假设实现是双向链接的,并从列表的开头搜索.indexOf()并从末尾搜索.lastIndexOf(),性能将取决于长度或与长度无关。