思路
方法1
下面提供了方法1的代码,可供参考
ret指针做返回链表的头指针,last做返回链表的尾指针
第一步:找头
使用指针p遍历链表,找到第一个val值不为给定val值的结构体,将其赋给ret指针,并使得last指针指向当前返回指针尾部,也就是ret指针指向的地方(因为当前返回链表长度为1)
第二步:填尾
使用指针p遍历链表,找到val值不为给定val值的结构体将其赋给last指针的next,然后调整last使其再次指向返回链表尾部
方法2
方法2较为简单,未给出代码实现
第一步:
定义一个虚的头部指针ret,使得ret->指向head,一个遍历指针p = ret
第二步:
若p->next->val = val,说明p->next需要被剔除,则令p = p->next->next,如此循环直至遍历整个链表
最后去掉我们先前定义的虚的头部指针,返回ret->next即可
代码
方法1
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode *ret = NULL, *last = NULL, *p = head;
while(p!=NULL){
if(ret==NULL){
if(p->val!=val){
ret = p;
p = p->next;
last = ret;
last->next = NULL;
}
else{p = p->next;}
}
else{
if(p->val!=val){
last->next = p;
p = p->next;
last = last->next;
last->next = NULL;
}
else{p = p->next;}
}
}
return ret;
}