看似不难其实麻烦,设置一个虚拟头结点是关键。记得将虚拟节点和
然后就是双指针,一个前一个后,分情况讨论。
法一:设置虚拟节点后将其和head相连,因为我们不会每一次都将pre->next指向cur。如果是val,就让pre->next=cur->next,cur往后,pre别往后,因为不保证下一个cur就是正常的,可能下一个还是val,所以pre不能这么快更新。如果不是val,就把pre更新为cur,cur继续更新。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//链表题就是考虑健壮性
//还有可能删除头结点的情况
ListNode* h = new ListNode(0);
h->next = head;
ListNode* cur = head, *pre = h;
while(cur != nullptr){
if(cur->val == val){
pre->next = cur->next;
cur = cur->next;
}
else{
pre = cur;
cur = cur->next;
}
}
return h->next;
}
};
法二:
就是不管是不是val,都要更新pre的next,这样就可以保证虚拟节点和这个链表是联通的
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//链表题就是考虑健壮性
//还有可能删除头结点的情况
ListNode* h = new ListNode(0);
ListNode* cur = head, *pre = h;
while(cur != nullptr){
if(cur->val == val){
pre->next = cur->next;
cur = cur->next;
}
else{
pre->next = cur;
pre = pre->next;
cur = cur->next;
}
}
return h->next;
}
};