我目前的职能是O(n)。它通过获取第一个列表并将其反转来附加两个列表类型结构,然后将其放回到第二个列表的前面。我不知道如何将这两个列表附加到我目前拥有的函数中。有谁知道我怎么能做到O(1)?
我目前的想法可能是我可能要做一个完全不同的功能。
追加功能:
ilist iappend_destroy(ilist il1, ilist il2){
if(il1 == NULL && il2 == NULL){
free(il1);
free(il2);
return NULL;
}else if(il1 == NULL){
free(il1);
return(il2);
}else if(il2 == NULL){
free(il2);
return(il1);
}else{
ilist tmp = iempty();
ilist clone = il1;
while(il1 != NULL){
tmp = icons_destroy(il1->first, tmp);
il1 = il1->rest;
}
ilist tmpclone = tmp;
while(tmp != NULL){
il2 = icons_destroy(tmp->first, il2);
tmp = tmp->rest;
}
idelete(tmpclone);
idelete(clone);
return il2;
}
追加功能正在使用的图标功能:
ilist icons_destroy(int in, ilist il){
if (il == NULL) {
ilist anewlist = malloc(sizeof(struct ilist_ADT));
anewlist->first = in;
anewlist->rest = NULL;
return (anewlist);
} else {
ilist previous = malloc(sizeof(struct ilist_ADT));
previous->first = il->first;
previous->rest = il->rest;
il->first = in;
il->rest = previous;
return il;
}
}
答案 0 :(得分:2)
假设正在销毁的原始列表正在销毁,就像您的代码中的情况一样,您可以使用以下算法在O(1)
中附加两个列表:
lAend ----------------------------+
V
listA -> item A1 -> item A2 -> item A3 -> null
listB -> item B1 -> item B2 -> item B3 -> null
^
lBend ----------------------------+
您需要列表末尾指针以及列表开头指针,但将listB
附加到listA
末尾的代码只是:
lAend->next = listB; lAend = lBend;
listB = null; lBend = null;
之后,listB
为空,listA
包含组合列表:
lAend ---------------------------------------+
listA -> item A1 -> item A2 -> item A3 --+ |
| |
+------------------------+ |
| V
+--> item B1 -> item B2 -> item B3 -> null
listB -> null
lBend -> null
如果你不存储结束指针,则O(1)
是不可能的,因为你需要找到第一个列表的最后一个元素,一个基本的O(n)
操作