快速随机访问链表节点

时间:2014-08-01 20:53:48

标签: c optimization linked-list random-access

我有一个单链表,可以有10000<<任何给定时间的节点。

现在在界面中我需要按顺序打印这些,用户可以访问单个节点并在该节点上执行操作。显然,如果用户在节点数上选择一个非常高的数字,它将必须超过数千个节点才能访问所需的节点。

我当前的修复程序将链接列表“转换”为数组,因为我的代码是多线程的,我的链接列表可以在任何给定时间增长。但是代码设计永远不会缩小。

这是我用来将链表转换为数组的代码。

unsigned int    i=0;
unsigned int    LL_arr_bufsize=128;
my_ll           **LL_arr;
my_ll           *temp;

LL_arr = malloc(LL_arr_bufsize * sizeof(my_ll *));
// err check mem alooc

temp = l_list->next;
while (temp != NULL) {
    LL_arr[i] = temp;

    temp = temp->next;

    if (++i == LL_arr_bufsize) {
        LL_arr_bufsize = LL_arr_bufsize * 2;
        LL_arr = realloc(LL_arr, LL_arr_bufsize * sizeof(my_ll *));
        // err check mem alloc
    }

} 

我基本上想知道是否有更好的方法来访问任何给定节点,而不会在访问给定节点之前产生遍历整个列表的开销......

1 个答案:

答案 0 :(得分:3)

我可能会投票,因为我只是想到了这个想法,它可能有一些缺陷。在这里。

如果您执行二维节点堆栈该怎么办?我出去了。

NodeList - 包含10个节点的数组,它是自己的索引。 (你可以试验更大的值)

NodeList是一个常规链接列表,您可以将其排队并再次排队。但是你可以获得一些你正在寻找的恒定时间查找。这是通过一个聪明的搜索功能完成的,它通常会通过链接列表,但是,一旦它到达您的特定节点在列表中保存的位置,您将从它存储的数组中查找恒定时间。

如果你愿意,我可以澄清更多这个概念,但我认为你可以很好地了解我对描述的看法。