我会做一个前置函数,并完成以下操作:
struct node* prepend(struct node* root, int value)
{
struct node* new_root = malloc(sizeof(struct node));
new_root->next = root;
return new_root;
}
struct node* reverselist(struct node* inlist)
{
struct node* outlist = NULL;
while(inlist != NULL) {
struct node* new_root = prepend(outlist, inlist->value);
outlist = new_root;
inlist = inlist->next;
}
return outlist;
}
没有测试过这个,但猜你掌握了它的想法。可能只是你的变量名,它没有描述任何内容,但我认为这种方法更清晰,更容易理解实际发生的情况。
编辑:
有一个问题为什么我不就地做,所以我会在这里回答:
- 你能就地做吗?您确定不想保留原始列表吗?
- 你需要就地做吗?malloc 是否耗时/这是代码的性能关键部分吗?请记住:过早优化是万恶之源。
事情是,这是第一个实现。它应该工作,而不是优化。它还应该在考虑这个实现之前编写一个测试,并且你应该保持这个缓慢的、未优化的实现直到测试通过,并且你已经证明它对你的使用来说很慢!
当您通过了单元测试并证明实现速度很慢时,您应该优化代码,并确保它仍然通过测试,而不更改测试。
另外,答案是否有必要就地操作?在恢复它之前分配内存怎么样,这样你只有一个分配调用,并且应该希望得到一个很好的性能提升。
这样每个人都很高兴,您的代码更简洁,并且避免了 Bob 叔叔拿着猎枪出现在您家门口的风险。