我正在编写一个C代码,用于将链接列表的内容复制到另一个列表中。我想知道是否有更有效的方法来做到这一点。
哪个更好?
struct node *copy(struct node *start1)
{
struct node *start2=NULL,*previous=NULL;
while(start1!=NULL)
{
struct node * temp = (struct node *) malloc (sizeof(struct node));
temp->info=start1->info;
temp->link=NULL;
if(start2==NULL)
{
start2=temp;
previous=temp;
}
else
{
previous->link=temp;
previous=temp;
}
start1=start1->link;
}
return start2;
}
OR
struct node *copy(struct node *start1)
{
if(start1==NULL) return;
struct node *temp=(struct node *) malloc(sizeof(struct node));
temp->info=start1->info;
temp->link=copy(start1->link);
return temp;
}
答案 0 :(得分:5)
要将一个链接列表复制到另一个链接列表,您有没有其他选项,但要迭代一个链接并继续将值复制到第二个,总共O(n)
次。
你已经这样做了。除非存储的元素之间存在某种关系,否则无法做得更好。
递归解决方案可能更适合查看,但实际上效率较低。
编辑:对于已更改的问题
迭代版本为better。
注意:LOC与效率没有直接关系。
答案 1 :(得分:1)
没有递归,这是你能得到的最紧凑的:
struct node *copy(struct node *org)
{
struct node *new=NULL,**tail = &new;
for( ;org; org = org->link) {
*tail = malloc (sizeof **tail );
(*tail)->info = org->info;
(*tail)->link = NULL;
tail = &(*tail)->link;
}
return new;
}
答案 2 :(得分:1)
对于 speed ,事实上可能有更好的方法。与往常一样,唯一真正的方法是对其进行基准测试。
可能更快:
花一次迭代来计算源列表的长度
int len = 0;
for (start2 = start1; start2 != NULL; start2 = start2->link)
++len;
为单个块中的所有必需节点分配空间
struct node *temp = malloc(len * sizeof(*temp));
然后花费第二次迭代来连接节点数组
int i = 0;
for (start2 = start1; start2 != NULL; start2 = start2->link) {
temp[i].info = start2->info;
temp[i].link = &temp[i+1];
}
temp[len-1].link = NULL;
正如我所说,我不承诺会更快(而且肯定更丑),但可能在某些系统上,有些编译器,一些条件。当然,如果您的其余代码假定您可以随意free
个别节点,那么它就是非首发。
对于 Elegant ,递归自然会赢。
简单的迭代方法通常是一个很好的折衷方案,但是,优雅之间但可能会爆炸,除非你有一个花哨的TCO编译器以及上面的内容,坦率地说有点丑陋将受益于解释性评论。