【发布时间】:2019-01-12 01:42:55
【问题描述】:
数组是与链表不同的数据结构,对吧? 或者我可以使用数组实现链表? 我对这个话题有点困惑,如果你能帮助我,我将不胜感激。 谢谢!
【问题讨论】:
标签: arrays data-structures linked-list
数组是与链表不同的数据结构,对吧? 或者我可以使用数组实现链表? 我对这个话题有点困惑,如果你能帮助我,我将不胜感激。 谢谢!
【问题讨论】:
标签: arrays data-structures linked-list
数组是与链表不同的数据结构,对吧?
是的,数组和链表是不同的数据结构。
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 |
---------------------
它的好处是,你可以通过它的索引直接访问数组的任何元素。例如如果你想访问 3rd 元素,你可以简单地做a[2]。缺点是除了数组末尾之外的任何位置的数组中元素的插入/删除都不是直截了当的。为此,您可能需要对数组的几个元素进行洗牌。
或者我可以使用数组实现链表?
是的,你可以。但是这样做不会有任何好处。相反,它会在您的代码中引入不必要的复杂性。检查this。
【讨论】:
正确。您可以使用链表实现数组,但它的工作效率不如普通 C 样式数组。您可以在技术上使用数组实现链表,但它至少会继承数组相对不灵活的大小。无论您要完成什么,它都不太可能是最佳实现。
通常,链表由具有指向链表中其他节点的指针的节点组成,其中大部分或全部将位于匿名分配的内存块中。如果您想重新排列列表中的元素,包括将元素插入现有列表的中间,这将为您提供更大的灵活性。
另一方面,数组有一个固定的空间。除非该语言已经解决了它的局限性,否则它不容易增长,尽管如果它是动态分配的,你可以重新分配它以使其更大——但这可能是以必须复制整个为代价的将事物转移到另一个内存区域,该区域具有连续内存段中的所有空间。
对于它的价值,我敢打赌,这个问题之前已经在堆栈溢出时被问过,并且有人给出了比我更好的答案,但是在搜索“链接列表与数组”的所有结果中都找到了它“可能很困难。话虽如此,我猜你正处于其中许多帖子也具有教育意义的地步。
【讨论】: