删除链表中等于给定值 val 的所有节点。链表为无头结点、单向、不循环。(由于涉及到结构体,所以写不了完整的测试代码,下面展示的代码为LeetCode中写的代码)
//第一次尝试:
//方法一:由于首元结点和非首元结点的删除不一样,所以情况讨论,如果要删除首元结点,只需先保留当前节点,然后将head指向下一个节点,再释放当前节点即可;
// 如果要删除的不是首元结点,那么每次都要保留要删除节点的上一个节点node和要删除元素的下一个节点next,然后释放掉当前节点,再让node指向next,直至结束即可;
struct ListNode* removeElements(struct ListNode* head, int val){ //对头结点的筛选 while(head != NULL&&head->val == val){ struct ListNode* node=head; head = head->next; free(node); } //对非头结点的筛选 struct ListNode* node = head; while(node != NULL&&node->next != NULL){ if(node->next->val == val){ struct ListNode* next = node->next; struct ListNode* nextnext = next->next; free(next); node->next = nextnext; } else{ node=node->next; } } //方法二:虚空大法,由于删除首元结点和非首元结点是不一样的,我们可以先创建一个虚首元结点,然后再把每个元素的删除当做非首元结点来看就行了,这样就可以将两种情况合二为一了
// 这样做的话,最终返回的就不是head了。而是head->next; struct ListNode _head; _head.next = head; head = &_head; struct ListNode* node=head; while(node != NULL&&node->next != NULL){ if(node->next->val == val){ struct ListNode* next = node->next; struct ListNode* nextnext = next->next; free(next); node->next = nextnext; } else{ node=node->next; } } return head->next; }
原文:https://www.cnblogs.com/zhm521/p/14110575.html