链接列表的操作时间复杂度

时间:2013-09-08 00:36:39

标签: java linked-list

我正在实施股票市场计划的链接列表。

它有和操作 - 购买

购买代码

//Stocks is a linked List like so 
//LinkedList<Integer> stocks = new LinkedList<Integer>();
public void buy(int q, int p) {
    stocks.addLast(q); //add number of stocks
    stocks.addLast(p); //for i stocks i +1 = price of stock
}

此操作addLast用于链接列表,显然将给定元素添加到当前列表末尾的新位置。

因此,例如,如果我有一个列表,可以说出以下数据

//Stock, price, stock, price etc...
[100, 50, 5000, 30, 8000, 60]

如果我addLast是最后一个元素的链接列表搜索然后添加,那么时间复杂度将是O(n)(仅就Big Oh而言)。或者它是否索引到列表的末尾,意识到列表的末尾是stocks[5]然后插入引用列表末尾的新数据的新节点?

所以我的问题是,addLast()是否对O(n)或O(1)的链表时间复杂度进行了操作?

发布以下任何说明

3 个答案:

答案 0 :(得分:5)

如果您读取了LinkedList类的javadoc,它会声明:“所有操作都可以执行双向链接列表。索引到列表中的操作将从头开始遍历列表或结束,以较接近指定索引为准。“

这意味着它是O(1)

修改

如果您想更好地实施您的股票名称,价格表,我认为创建一个包含股票描述的类会更好:

public class Stock {
    private int stockName;
    private int stockPrice;

    // other methods, properties, constructor
}

然后创建LinkedList<Stock>

答案 1 :(得分:2)

add()addLast()的复杂性在列表长度上为O(1)。通过阅读LinkedList source code.

,这一点很明显

(由于行为的这一方面没有在javadoc 1 中精确指定,理论上可以改变......但是,我们可以自信地排除这种可能性。即使它有意义(事实并非如此!),这样的改变会破坏许多现有的应用程序。仅凭这一点就足以说明它是不可信的了。)


1 - 我认为javadoc句子“[o] perations指向列表将从开头或结尾遍历列表,以较接近指定的索引为准” 不明确地适用于此方法。你可以说add / addLast方法不会索引进入列表。

答案 2 :(得分:1)

查看LinkedList类的源代码,addLast实际上调用了一个名为linkLast的方法:

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}

相关部分是在last类中声明transient Node<E> last;的地方,看来该类保存了指向最后一个节点的“指针”。然后使用给定的新节点进行更新。因此,无论列表的大小如何,都应为O(1)。