力扣(链接放这里喽)
先贴代码再做讲解:
struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* cur = head;struct ListNode* tail = NULL;while(cur){if(cur->val == val){if(cur == head){head = head->next;free(cur);cur = head;} else{tail->next = cur->next;free(cur);cur = tail->next;}}else{ tail = cur;cur = cur->next; }}if(tail)tail->next = NULL;return head;
}
我们应该先将情况考虑周全,画图分析思路 :
我们假设有上述这种情况,按照题目设想,前面三个6都应该free掉,从3这个位置开始,也就是说我们要返回的头就从此处开始,所以我们先考虑值相等,过掉再继续。
在这个位置,要有一个继续往后走的指针,和保存头部位置的指针,以及一个保存尾部的指针来连接后面的5,因为head确定后就不会再动了,而遍历指针过掉中间的6时,3与5是不相接的,要连接只能说找尾指针。
还有第二种思路,就是值不相等就拿下来,值相等就跳过,free掉:
struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* cur = head;struct ListNode* temp = NULL;struct ListNode* tail = NULL;while(cur){if(cur->val == val){temp = cur;cur = cur->next;free(temp);} else {if(tail == NULL)head = tail = cur;else {tail->next = cur;tail = cur;} cur = cur->next;}}if(tail)tail->next = NULL;if(tail == NULL)return NULL;return head;
}