【问题标题】:Linked Lists Vs Arrays (Implemented?)链表与数组(已实现?)
【发布时间】:2019-01-12 01:42:55
【问题描述】:

数组是与链表不同的数据结构,对吧? 或者我可以使用数组实现链表? 我对这个话题有点困惑,如果你能帮助我,我将不胜感激。 谢谢!

【问题讨论】:

    标签: arrays data-structures linked-list


    【解决方案1】:

    数组是与链表不同的数据结构,对吧?

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

    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

    【讨论】:

    • 出于某种原因,这个话题对我来说有点令人困惑,但在阅读了你的答案之后,现在一切都变得清晰了!非常感谢!
    【解决方案2】:

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

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

    另一方面,数组有一个固定的空间。除非该语言已经解决了它的局限性,否则它不容易增长,尽管如果它是动态分配的,你可以重新分配它以使其更大——但这可能是以必须复制整个为代价的将事物转移到另一个内存区域,该区域具有连续内存段中的所有空间。

    对于它的价值,我敢打赌,这个问题之前已经在堆栈溢出时被问过,并且有人给出了比我更好的答案,但是在搜索“链接列表与数组”的所有结果中都找到了它“可能很困难。话虽如此,我猜你正处于其中许多帖子也具有教育意义的地步。

    【讨论】:

      猜你喜欢
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多