我正在实施股票市场计划的链接列表。
它有和操作 - 购买
购买代码
//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)的链表时间复杂度进行了操作?
发布以下任何说明
答案 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)。