(剑指offer18.删除链表节点)给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。

ListNode p = head;
while(p != NULL && p->next != NULL){
if(p->next->val == val){
p->next = p->next->next;
}
p = p->next;
}
return head;
注意:一定要将p != NULL 写在前面,否则可能会报错(因为p = NULL时,p->next相当于引用空指针了,会报错runtime error: member access within null pointer of type ‘ListNode’ )(样例为*[-3,5,-99] -99
时,最后p = p->next时p就为NULL,只有p->next != NULL会报错)

还有另一种解法(我们可以引入两个指针):
ListNode pre = head;
ListNode
cur = head->next;
while(cur != NULL){
if(cur->val == val){
pre->next = cur->next;
}
pre = pre->next;
cur = cur->next;
}
return head;

2022.6.12:
image.png
while(cur != NULL && cur->val == val){
还是老问题,为了防止应用空指针,在用if()或者while()进行判断时,一定要将p != NULL放在令一个条件前面,这个问题真的很致命(否则就会先计算p->next然而此时的p为NULL,会直接报错!!!)