删除最后一个节点的逻辑如下:
转到节点的指针,其下一个是NULL
然后释放它,对吗?
我试图在函数中实现这个逻辑:
node* Delete_Last(node*head){
node* i=head;
while (i->next!=NULL){
i=i->next;
}
free(i);
i=NULL;
return head;
}
当我尝试打印列表时,我不能 - 这是一个无限循环。 你能说出我的逻辑中有什么缺陷以及如何纠正它吗?
答案 0 :(得分:2)
不,不对。您还必须更新上一个节点的下一个节点,并且如果head是最后一个节点则返回。所以首先你应该把指针指向头部指针,你需要这个以防万一你需要更新头部。其次,因为它是单链表,你应该保留上一个节点:
node* Delete_Last(node** head) {
if (!*head) {
return 0;
}
node* i = *head, *previous = 0;
while (i->next){
previous = i;
i = i->next;
}
free(i);
if (previous) {
previous->next = 0;
} else {
*head = 0;
}
return previous;
}
我不知道你想要返回什么,所以我假设你的代码是新的结局,再回头也没有意义。现在你可以用:
来调用它node* prevLast = Delete_Last(&head);