给定链表的头和一个整数val
,删除链表中所有具有Node.val == val
的节点,并返回新的头。
这是我的尝试
struct ListNode *removeElements(struct ListNode *head, int val) {
struct ListNode *tmp, *prev;
if (head == NULL)
return head;
for (tmp = head, prev = NULL; tmp != NULL; prev = tmp, tmp = tmp->next)
if (tmp->val == val) {
prev->next = tmp->next;
free(tmp);
}
return head;
}
但我发现了分割错误问题看起来很简单,但我不知道我错在哪里。
2条答案
按热度按时间57hvy0tb1#
如果第一个节点的值为
val
,则语句prev->next = tmp->next;
将导致分段错误,因为prev
是空指针。在你的方法中,你必须对列表的开头做一个特殊的处理:下面是一个使用双指针的简单解决方案:
qojgxg4l2#
这个for循环
有三个问题
主要问题是循环本身并不改变指针(变量)
head
。因此,如果头节点的数据成员
val
等于变量val
的值,则指针head
的值将不会改变。第二个问题是,最初指针
prev
等于NULL
。因此,如果指针head
指向的节点将被删除,则在此语句中使用空指针来访问内存这会导致未定义的行为。
最后第三个问题是,可以使用已经删除的节点
在for循环的表达式中
同样在这种情况下,指针
prev
被设置为指向被删除节点的指针tmp
可以实施两种方法。
第一个是首先检查指针
head
所指向的节点。给你.
第二种方法是通过指向列表中的指针来引用它们。
请注意,你应该始终在使用变量的最小范围内声明变量。