为什么 LinkedList 需要 Java 中的节点 class?

Why do I need the Node class in Java for LinkedList?

在浏览了关于链接列表的不同教程后,我看到一些人提到 Java Node class 用于链接到上一个和下一个节点,而有些人根本不使用它创建一个链表。

链表需要节点 class 吗? 为什么有些教程似乎在没有它的情况下创建链表? 另请阅读,使用节点 class 是创建链表 [​​=13=] 的“正式”方式

如果您问是否(以及为什么)需要创建 Node 个实例来使用 java.util.LinkedList,答案是:不,您不需要。列表本身会处理这个问题。

(注意你linked toNodeclass不是链表节点,它实际上表示DOM中的一个节点。实际Node class 由 java.util.LinkedList 内部使用 是私有的 class。)


如果您要问为什么链表 通常 需要 Node 类型,答案是它们不需要。

创建链表的另一种方法(不涉及 Node 类型)是直接将列表的元素彼此链接起来。这有几个后果:

  1. 这要求元素 class 本身有一个 next 字段(可能还有一个 prev 字段)用于链接元素。

  2. 意思是给定的元素实例一次只能是一个列表的成员,不能是同一个列表的成员两次。

总的来说,这些意味着无节点方法与标准不兼容 java.util.List API。

从 OO 设计的角度来看,无节点方法也很糟糕:

  • 通过向元素类型添加 nextprev 字段,您正在打破抽象边界和关注点分离。
  • 元素实例现在知道该元素所属的列表。
  • 列表抽象仅适用于某些类型的元素,并且必须考虑元素属于哪个列表。

这些东西很容易使无节点列表抽象更难使用……并且更难重用。 (虽然在有限的情况下,它可能仍然是一个很好的解决方案。)

从技术上讲,您不一定 需要 节点 class,但具有节点 class 的设计是好的设计。没有一个的设计是糟糕的设计。

这个答案有点自以为是,但基于我们在编程的第一年或至少第二年都应该学到的东西,所以基于共识。

假设我们有一个学生列表。现在每个 Student 对象的自然责任是拥有(“知道”)学生的联系信息、注册的课程、取得的成绩等。不是 的自然责任Student 对象知道它是链接列表的一部分,更不用说该列表是单链接还是双链接了。对于这一责任,我们有 Node class.

使用 Node class 的设计具有进一步的潜在优势,您可以设计和编写通用链表并使用它来实例化学生列表、教师列表、课程列表等。Stephen C 在另一个答案中提到了更多优势。

历史背景:我在 1980 年左右学习数据结构时,我们会为每个学生记录配备一个 next 指针。 (我们学的是单向链表,双向链表只是顺便提一下。)现在被认为是糟糕的设计。我还希望它早就不用了。

性能(跳过这一段,直到你真正需要它:-):在业务对象(如 Student 中使用 nextprevious 引用的糟糕设计通常会稍微好一些.因此,如果您处于性能是一个非常现实的问题的情况下,您可以考虑它。它不是唾手可得的果实,因为它会污染您的设计,因此它可能会排在您为提高性能而采取的措施列表的底部。