如果我使用抽象数据类型的标准定义作为提供一些功能来管理数据集合的黑盒,则链表符合该描述:
提供函数add(x)和get(i)(以及其他函数)的容器,可用于维护对象列表。
但当你问这个问题,这些操作的时间复杂性是多少时,你就会意识到这取决于这个容器是如何实现的:
如果您只是在内部维护到head节点的链接,那么以上两个操作将在O(n)时间内执行。如果您另外维护一个到尾部节点的链接,那么在这两个节点上都将获得O(1)时间。
所以我的问题是,出于学习目的,你认为链表是ADT还是数据结构?
这个问题是在我试图实现Skiena的算法设计手册中的Stack ADT时产生的,当时我正在阅读关于它的put(x)和get()方法的性能将如何取决于选择什么数据结构来实现它。书中说,在这种情况下,如果你选择一个数组或链表数据结构来实施这个ADT,它们都提供了相似的性能。
但是他们呢?这不是取决于链接列表是如何实现的吗?有很多方法可以实现链表本身,所以这一事实不就是另一个ADT本身吗?
从维基百科上的ADT:In computing, an abstract data type (ADT) is a mathematical model for a certain class of data structures that have similar behavior
所以,链表是一个ADT,每个ADT也是一个数据结构,所以链表是两者。
编辑:
但是,请注意,单链表和双链表都有相同的操作,这些操作的复杂性也相同,所以它们都是链表ADT,我们不区分它们。但它们是不同的数据结构!
链表是一个ADT
当你谈论数据结构时,你基本上有堆栈、队列和列表(不要称之为链表)、树等。
当你对链表提出疑问时,它是一个ADT。抽象数据类型。因此,独立地说,它没有任何价值。但是,当您想要实现列表、堆栈或队列时,您需要使用链表或数组。
它是抽象的,因为它有多个操作,可以在需要时与之关联,具体取决于实现的类型。
C和C++标准模板库中的列表实现了双链表。链表一直被用于列表的实现,这就是为什么它已经成为列表数据结构的同义词。
链表本身不是抽象的,而是具体的。它被认为是一种数据结构。访问链表中数据的时间复杂性将取决于您访问的元素以及列表中有多少元素,因为您必须对它们进行迭代才能找到所需的元素。
http://en.wikipedia.org/wiki/Linked_list