我想通过将节点附加到尾部来构建列表 {1, 2, 3, 4, 5}。对于我们的客户端而言,所有其他节点都使用尾指针插入到最后一个节点之后。这个解决方案的唯一“问题”是可以优化第一个节点的编码单独的特殊情况,而客户正在向我施压。尽管如此,这种方法在理论上应该是生产代码的可靠方法……至少我认为直到它在我到达尾部时一直抛出空指针异常……我是不是遗漏了什么?
struct node* BuildWithSpecialCase() {
struct node* head = NULL;
struct node* tail;
int i;
Push(&head, 1);
tail = head;
for (i=2; i<6; i++) {
Push(&(tail->next), i);
}
return(head);
}
最佳答案
如果您所有的访问指针都从头部移动到尾部,那么将节点添加到尾部会将它们暴露给在列表“查询”开始时不存在的"new"数据。
与您的客户交谈,可能不仅仅是“优化”受到威胁。
--- 看到你的代码编辑后编辑---
如果不了解 Push
是做什么的,我猜它会将一个节点推到链表的顶部,就好像它是一个堆栈一样。
Push(&head, 1);
tail = head;
到目前为止,还不错。
for (i=2; i<6; i++) {
Push(&(tail->next), i);
}
看起来您只是Push
尾部的几个节点,但我看不到您实际更新尾部的位置以保持它对列表末尾的引用。在我的阅读中,head
仍然指向列表的头部,tail
仍然指向列表的头部(来自赋值 tail = head
) 并且您在尾部之外还有很多“额外”节点。
是这个问题吗?
关于c - 通过构建尾部优化链表中的一个特例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12301315/