链接列表是ADT还是数据结构,或两者兼而有之?

时间:2011-06-30 18:05:53

标签: arrays data-structures linked-list abstract-data-type

如果我将抽象数据类型的标准定义用作提供管理数据集合的一些函数的黑盒子,则链接列表符合该描述:

提供可用于维护对象列表的函数add(x)和get(i)(以及其他)的容器。

但是当你问这个问题时,这些操作的时间复杂度是多少,那么你就会意识到这取决于这个容器的实现方式:

如果您只是在内部维护到头节点的链接,则上述两个操作将在O(n)时间内执行。如果你另外维护一个到尾节点的链接,那么你将获得O(1)时间。

所以我的问题是,出于学习目的,您是否将链接列表视为ADT或数据结构?

当我尝试从Skiena的算法设计手册中实现Stack ADT时,出现了这个问题,并且正在阅读它的put(x)和get()方法的性能将取决于选择实现什么数据结构它。本书说在这种情况下,如果选择阵列或链表数据结构来实现这个ADT并不重要,它们都提供类似的性能。

但他们呢?是否取决于链接列表的实现方式?有很多方法可以实现链表本身,所以这不是它本身就是另一个ADT吗?

3 个答案:

答案 0 :(得分:7)

来自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有关。但它们是不同的数据结构!

答案 1 :(得分:2)

链接列表是ADT。

当你谈论数据结构时,基本上你有 - 堆栈,队列和列表(不要调用这个链表),树等等。

当您对链接列表提出质疑时,它是一个ADT。抽象数据类型。所以独立它没有价值。但是当您想要实现List或Stack或Queue时,您需要使用Linked List或Array。

它是抽象的,因为它有多个操作,可以在需要时根据实现的类型与它相关联。

C和C ++标准模板库中的列表实现双链表。 Linked List一直用于列表的实现,这就是它与List数据结构同义的原因。

答案 2 :(得分:0)

链表本身并不是抽象的,而是具体的。它被认为是一种数据结构。访问链表中数据的时间复杂性取决于您访问的元素和列表中的元素数量,因为您必须遍历它们以获得所需的元素。

http://en.wikipedia.org/wiki/Linked_list