我遇到了this网站,其中使用以下代码删除了链接列表的最后一个节点:
int remove_last(node_t * head) {
int retval = 0;
/* if there is only one item in the list, remove it */
if (head->next == NULL) {
head->val
free(head);
head = NULL;
return retval;
}
node_t * current = head;
while (current->next->next != NULL) {
current = current->next;
}
}
我的问题很简单,这个例子不是错了吗?我的意思是,只有当只有一个节点时才会释放节点的内存。在任何其他情况下,它并没有真正做某事,只是继续前往while (current->next->next != NULL)
循环中的下一个节点。我没注意到什么吗?
答案 0 :(得分:1)
你是对的。方法错了。而且head本身可以等于NULL,所以甚至是方法的第一个可执行语句
if (head->next == NULL) {
会导致程序异常终止。
在此声明下面有语法错误
if (head->next == NULL) {
head->val
free(head);
因此代码不会被编译。
答案 1 :(得分:1)
你可以尝试这个:
int remove_last(node_t * head)
{
int retval = 0;
/* if there is only one item in the list, remove it */
if (head->next == NULL)
{
retval = head->val;
free(head);
head = NULL;
return retval;
}
/*if there are another items */
else
{
node_t * current = head;
while (current->next->next != NULL)
current = current->next;
retval = current->val;
free(current->next);
current->next = NULL;
}
return retval;
}