我已经看到链接列表的许多实现在头部添加,然后更新头部引用或不修改头部引用并在尾部添加每次更新它。一个与另一个有明显的好处吗?哪一个是首选的实施方式?
答案 0 :(得分:1)
根本没有任何好处。事实上,唯一让头部和尾部成为尾部的是我们称之为头部和尾部。你可以用尾巴替换头部,用头部替换尾部,你可以使用相同的精确列表,除非它是“向后”。 (这确实假设一个双重链表......)
有点像物质和反物质......
答案 1 :(得分:1)
链表的绝对最简单的实现只能(有效地)添加到头部。为了添加到尾部,您需要一个指向当前最后一个元素的第二个指针。
用户可能希望能够添加到任意一端,并且能够在常量时间内查询列表长度,并从尾部到头部遍历列表(意味着您需要一个双链表),所以a合理的默认实现应该支持(就像java.util中那样)。
如果您可以证明有限的功能并获得一些真正的好处(例如尾部共享以降低存储要求),那么您只会使用单链接列表。 ConcurrentLinkedQueue似乎是单链接的,以允许无锁并发。 Javadocs中提到了无法知道当前长度的权衡。
答案 2 :(得分:0)
java.util.LinkedList实现了两种功能。它使它成为通用的 - 可以将它用作队列(FIFO)和堆栈(LIFO)