链接列表与数组(已实现?)

时间:2019-01-12 01:42:55

标签: arrays data-structures linked-list

数组与链表的数据结构不同吗? 或者我可以使用数组实现链接列表? 我对此主题有些困惑,如果能帮助我,将不胜感激。 谢谢!

2 个答案:

答案 0 :(得分:2)

  

数组与链表的数据结构不同吗?

是的,数组和链表是不同的数据结构。

Linked list
链接列表是数据元素的线性集合,其顺序不是由其在内存中的物理位置给出的。相反,每个元素都指向下一个。它是一种数据结构,由节点的集合组成,这些节点一起代表一个序列。

假设您已定义了这样的节点结构(在示例中使用C语言构造):

struct Node 
{ 
    int data; 
    struct Node *next; 
}; 

链表的每个节点都有一个整数和一个指向其下一个节点的指针,该指针用于访问列表的下一个成员(最后一个节点的下一个指针设置为NULL)。内存中的视图如下所示:

---------    ---------    ---------    ---------
| 1 |  -|--->| 2 |  -|--->| 3 |  -|--->| 4 |  -|--->NULL
---------    ---------    ---------    ---------

它提供了在任何位置插入/删除列表中元素的灵活性,您只需要设置/重置节点的下一个指针即可。缺点是它需要顺序遍历才能访问其节点。

Array
数组数据结构(或简称为数组)是由元素(值或变量)的集合组成的数据结构,每个元素都由至少一个数组索引或键标识。

假设您有5个整数的数组(在示例中使用C语言构造):

int arr[5] = {0}; // array of 5 integer initialized with 0

内存视图如下所示:

  index   0   1   2   3   4
    arr ---------------------
        | 0 | 0 | 0 | 0 | 0 |
        ---------------------

它的优点是,您可以直接通过其索引访问数组的任何元素。例如如果要访问3 rd 元素,则只需执行a[2]。缺点是在数组的任何位置(数组末尾除外)都无法直接插入/删除元素。为此,您可能必须重新整理数组的几个元素。

  

或者我可以使用数组实现链接列表?

是的,可以。但是这样做将不会带来任何好处。相反,它将在您的代码中引入不必要的复杂性。选中this

答案 1 :(得分:1)

正确。您可以使用链表实现数组,但它的效率不如普通C样式数组高。从技术上讲,您可以使用数组来实现链表,但它至少会继承数组相对不灵活的大小。无论您要完成什么,它都不可能是最佳的实现。

通常,链接列表由具有指向列表中其他节点的指针的节点组成,其中大多数或全部将位于匿名分配的内存块中。如果您要重新排列列表中的元素,包括将元素插入到现有列表的中间,这将为您提供更大的灵活性。

另一方面,数组具有固定的空间。除非该语言已做一些事情来解决其局限性,否则要扩展它并不容易,尽管如果它是动态分配的,则可以将其重新分配为更大的大小,但这可能要付出复制整个代码的代价。到另一个存储区域,该存储区域在连续的存储段中具有所有存储空间。

对于它的价值,我敢打赌,这个问题在堆栈溢出之前就已经被问过了,有人给了比我更好的答案,但是在搜索“链接列表与数组”的所有结果中都找到了它。可能很难。就是说,我想您正处于许多这些职位也具有教育意义的时候。