解法1:头结点和非头结点分别处理
struct ListNode* deleteNode(struct ListNode* head, int val){
if (head == NULL)
return NULL;
struct ListNode* ptr = head;
if (head->val == val) { //头结点单独处理
head = head->next;
free(ptr);
return head;
}
struct ListNode* del;
while (ptr->next) { //非头结点处理
if (ptr->next->val == val) {
del = ptr->next;
ptr->next = del->next;
free(del);
break;
}
ptr = ptr->next;
}
return head;
}
之所以将头结点和非头结点分别处理,是因为可能会修改头结点,这也是很多修改删除链表节点的函数传入的是二级指针。
解法2:创造辅助头结点
struct ListNode* deleteNode(struct ListNode* head, int val){
if (head == NULL)
return NULL;
struct ListNode* new_head = (struct ListNode*)calloc(1, sizeof(struct ListNode));
new_head->next = head;
struct ListNode* ptr = new_head;
struct ListNode* del;
while (ptr->next) {
if (ptr->next->val == val) {
del = ptr->next;
ptr->next = del->next;
free(del);
break;
}
ptr = ptr->next;
}
head = new_head->next;
free(new_head);
return head;
}
综上,所有需要删除的节点都需要free()掉,不然会内存泄漏。