莽子解法
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode *p,*pre,*s;
if(head == NULL)//考虑特殊情况,空链表
{
return NULL;
}
while((head != NULL)&&(head->val == val))//NULL->next会报错; && 是从左至右判断
{
s = head;
head = head ->next;
free(s);
}
if(head != NULL)
{
pre = head;
p = head->next;
}
else
return NULL;
//printf("%d",head->val);头结点不为空,注意
while(p!=NULL)
{
if(p->val == val)//有可能p后面无结点---多虑了
{
s = p;
p = p->next;
pre->next = p;
free(s);
}
else{
pre = p;
p = p->next;
}
}
return head;
}
新思路
LeetCode里面链表中,头结点大多都存储了数据,所有可以假装给它加一个空的头结点,一切都好办了起来。
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode *L = (struct ListNode*)malloc(sizeof(struct ListNode)),*pre,*p,*s;//注意构建
L->next = head;
pre = L;p = L->next;
while(p!=NULL)
{
if(p->val == val)
{
s = p;
p = p->next;
pre->next = p;
}
else{
pre = p;
p = p->next;
}
}
return L->next;
}