我想通过将节点附加到尾部来构建一个列表{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);
}
最佳答案
如果所有的访问指针都是从头部到尾部的,那么向尾部添加节点会使它们暴露在“查询”列表开始时不存在的“新”数据。
与你的客户交谈,也许不仅仅是“优化”的问题。
---在看到代码编辑后编辑---
如果不知道Push
在做什么,我猜它会把一个节点推到链表的顶部,就像它是一个堆栈一样。
Push(&head, 1);
tail = head;
到目前为止,还不错。
for (i=2; i<6; i++) {
Push(&(tail->next), i);
}
看起来您只是在尾部编辑了几个节点,但我看不到您实际上在哪里更新了尾部以保持它对列表末尾的引用。在我的阅读中,
Push
仍然指向列表的头部,head
仍然指向列表的头部(来自赋值tail
),并且除了tail之外还有很多“额外”节点。这就是问题所在吗?
关于c - 通过尾部构建优化链表中的特殊情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12301315/