在浏览了不同的链表教程后,我看到有些教程提到了Java Node类,用于链接到上一个和下一个节点,而有些在创建链表时根本没有使用它。
链表需要Node类吗?为什么有些教程似乎没有使用它就创建了链表?另请阅读使用Node类是"正式的"。链接列表的创建方法
如果您问是否(以及为什么)需要创建Node
实例来使用java.util.LinkedList
,答案是:不,您不需要。列表本身负责这个。
(注意,您链接到的Node
类不是链表节点。它实际上表示DOM中的一个节点。java.util.LinkedList
内部使用的实际Node
类是一个私有类。)
如果你问为什么链表一般需要Node
类型,答案是它们不需要。
另一种创建链表的方法(不涉及Node
类型)是直接将链表的元素彼此链接。这会产生两个结果:
-
这要求元素类本身有一个
next
字段(也可能是prev
字段)用于链接元素。 -
这意味着一个给定的元素实例一次只能是一个列表的成员,并且不能是同一个列表的成员两次。
这意味着无节点方法与标准java.util.List
API不兼容。
从OO设计的角度来看,无节点的方法也是不好的:
- 通过将
next
和prev
字段添加到元素类型中,您正在打破抽象边界和关注点分离。 - 元素实例现在知道该元素属于哪个列表。
- 列表抽象只适用于特定类型的元素,并且必须考虑,列表中元素是其成员。
这些东西容易使无节点列表抽象更难使用…而且更不容易重复使用。(尽管在有限的情况下,它可能仍然是一个很好的解决方案。)
技术上不一定需要节点类,但是带有节点类的设计是好的设计。没有一个的设计是糟糕的设计。
这个答案有点固执己见,但基于我们在第一年或至少第二年编程时应该学到的东西,所以是基于共识的。
假设我们有一个学生名单。现在,每个Student
对象自然有责任知道("知道")学生的联系信息、注册的课程、取得的成绩等。不是Student
对象的自然责任,知道它是链表的一部分,更不用说该列表是单链接还是双链接。对于这个职责,我们有Node
类。
Node
类的设计还有一个潜在的优势,你可以设计和编写一个通用的链表,并用它来实例化一个学生列表、一个教师列表、一个课程列表等。Stephen C在另一个回答中提到了更多的优势。
历史背景:我在1980年左右学习数据结构,我们会用next
指针来匹配每个学生的记录。(我们学习了单链表。双链表只是顺带提到过。)现在被认为是糟糕的设计。我曾希望它早就不用了。
性能(跳过这一段,直到您真正需要它:-):在业务对象(如Student
)中使用next
和previous
引用的糟糕设计通常会稍微好一些。因此,如果您的情况下,性能是一个非常现实的问题,您可能会考虑它。它不是唾手可得的果实,因为它会污染您的设计,所以它可能会接近您为获得更好的性能而采取的措施列表的底部。