(一)题目描述
![在这里插入图片描述](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
(二)题目意图
删除head链表中所有的val == Node.val的结点,最终返回头结点。
(三)题目分析
- head结点和非头结点的删除方式不同
- 是否使用伪头结点
我的错误分析:误以为head中的val不作为val==head->val的条件,所以未对head结点进行处理。
未考虑到的:head结点为nullptr
(四)画图分析
例如:删除[6,2,6,3,4,5,6]中的6
(1)未使用伪头结点
![在这里插入图片描述](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
可以看到删除的结点既有头结点、中间结点、尾结点。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public: ListNode* removeElements(ListNode* head, int val){ while(head != NULL && head->val == val) { ListNode* tmp = head; head = head->next; delete tmp; }
ListNode* p = head; while(p != NULL && p->next != NULL) { if(p->next->val == val) { ListNode* tmp = p->next; p->next = p->next->next; delete tmp; } else { p = p->next; } } return head; } };
|
(2)使用伪头结点
![在这里插入图片描述](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: ListNode* removeElements(ListNode* head, int val) { ListNode* tmphead = new ListNode(0, head);
ListNode* p = tmphead; while(p->next != NULL ) { if(p->next->val == val) { ListNode* tmp = p->next; p->next = p->next->next; delete tmp;
} else { p = p->next; } } head = tmphead->next; delete tmphead; return head; } };
|