链表实现,是在开头还是在结尾添加?

问题描述

| 我已经看到了链表的许多实现,这些实现在头添加,然后更新头参考,或者不修改头参考,而在尾添加,每次更新它。一个人与另一个人相比有明显的好处吗?哪一种是首选的实现方式?     

解决方法

根本没有好处。实际上,唯一使头部成为头部而使尾部成为尾部的是我们称一个为头部而一个为尾部。您可以将head替换为tail,然后将tail替换为head,您将拥有相同的确切列表,只是列表为“ backwards。”(这确实是一个双向链表...)。 有点像物质和反物质...     ,链表的绝对最简单的实现只能(有效)添加在最前面。为了添加到尾部,您需要第二个指针指向当前的最后一个元素。 用户可能希望能够添加到任一端,以及能够在恒定时间内查询列表长度,并从尾到头遍历列表(这意味着您需要一个双向链接的列表),因此是一个合理的默认实现应该支持这一点(就像java.util中的那样)。 如果您可以证明有限的功能是合理的,并且从中获得一些实际的利益(例如,通过分尾共享以减少存储需求),则只会使用单链接列表。 ConcurrentLinkedQueue似乎是单链接的,以允许无锁并发。 Javadocs中提到了无法知道当前长度的折衷。     ,java.util.LinkedList实现两种功能。它使其具有通用性-可以将其用作队列(FIFO)和堆栈(LIFO)