我有一个单链表,可以有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
}
}
我基本上想知道是否有更好的方法来访问任何给定节点,而不会在访问给定节点之前产生遍历整个列表的开销......
答案 0 :(得分:3)
我可能会投票,因为我只是想到了这个想法,它可能有一些缺陷。在这里。
如果您执行二维节点堆栈该怎么办?我出去了。
NodeList
- 包含10个节点的数组,它是自己的索引。 (你可以试验更大的值)
NodeList
是一个常规链接列表,您可以将其排队并再次排队。但是你可以获得一些你正在寻找的恒定时间查找。这是通过一个聪明的搜索功能完成的,它通常会通过链接列表,但是,一旦它到达您的特定节点在列表中保存的位置,您将从它存储的数组中查找恒定时间。
如果你愿意,我可以澄清更多这个概念,但我认为你可以很好地了解我对描述的看法。