如何用数组实现一个紧凑的链表?

Posted

技术标签:

【中文标题】如何用数组实现一个紧凑的链表?【英文标题】:How to implement a compact linked list with array? 【发布时间】:2014-03-22 06:18:14 【问题描述】:

这里是练习题CLRS10.3-4我正在努力解决

通常希望在存储中保持双向链表的所有元素紧凑, 例如,使用多数组表示中的前 m 个索引位置。 (这是分页的虚拟内存计算环境中的情况。)解释如何实现过程 ALLOCATE OBJECT 和 FREE OBJECT 以使表示紧凑。假设在链表本身之外没有指向链表元素的指针。 (提示:使用堆栈的数组实现。)

到目前为止,这是我的解决方案

int free; 
int allocate()

    if(free == n+1)
        return 0;
    int tmp = free;
    free = next[free];
    return tmp;

int deallocate(int pos)


    for(;pos[next]!=free;pos[next])
    
        next[pos] = next[next[pos]];
        prev[pos] = prev[next[pos]];
        key[pos] = key[next[pos]];
    
    int tmp = free;
    free = pos;
    next[free] = tmp;

现在,问题是,如果是这样的话,我们就不需要链表了。如果删除是 O(n),我们可以使用普通数组来实现它。其次,我也没有使用堆栈的数组实现。那么问题在哪里呢?我应该如何开始?

【问题讨论】:

那不是你在那里实现的链表吗? 是的,它是一个紧凑的链表实现。 我想我当时不明白这个问题 问题是以这样的方式实现链表,如果有 n 个元素并且 m 是链表的大小,那么分配的对象应该是从 1...n 和空闲内存应该是 n+1...m 。这就是我的想法。我真的不知道虚拟内存分页。所以我无法理解。 您可能不应该创建一个名为 free 的变量,因为这在 C(因此是 C++)语言中是一个重要的词。 【参考方案1】:

您不必立即缩小列表。只需留下一个洞并将该洞链接到您的免费​​列表。一旦你分配了内存,它就是你的了。因此,假设您的页面大小为 1K。即使列表为空,您的初始分配列表大小也将为 1K。现在您可以非常有效地添加和删除项目。

然后将另一种方法引入pack您的列表,即删除所有孔。请记住,调用 pack-method 后,所有“引用”都将变为无效。

【讨论】:

以上是关于如何用数组实现一个紧凑的链表?的主要内容,如果未能解决你的问题,请参考以下文章

链表的数组实现中,令链表和自由表变得紧凑《算法导论》10.3-5

C++ 等价于 Java 的链表/C# 的数组列表?

使用向量类实现堆栈的链表与动态数组

用于实现堆栈的链表与动态数组

从c中的链表数组返回排序列表

常见的链表排序(Java版)