原文题目:
203. Remove Linked List Elements
读题:
删除链表中节点的值与目标值相等的节点,这和单链表删除某个节点不一样的地方在于,可能需要删除多个节点。
解法一是自己写的,利用两个指针p和q,如果p,q相等,则将p->next = q->next,跳过q节点
解法二是AC代码里比较好的
//方法一 42ms
class Solution
{
public:
ListNode* removeElements(ListNode* head, int val)
{
ListNode* temp = new ListNode(0);
temp->next = head;
ListNode *p = temp;
ListNode* q = head;
while(q)
{
//相等则删除该节点,
if(q->val == val)
{
p->next = q->next;
}
//不相等则将p指向q节点,这里的p至是临时指针,最后返回的是temp,因此p的改变不影响返回
else
{
p = q;
}
q = q->next;
}
return temp->next;
}
};
//方法二 25ms
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if(!head) return nullptr;
//递归处理,将head的下一个节点指向剩余处理过的链表
head->next = removeElements(head->next, val);
//当head第一个节点为目标值,则将head往后移动一个节点即可,
if(head->val == val)
{
ListNode * temp = head;
head = head->next;
delete temp;
}
return head;
}
};