原文题目:
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; } };