题目链接:https://leetcode-cn.com/problems/remove-linked-list-elements/
题目说明:
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
题目思路:
删除链表中的元素会面临删除头节点,删除中间元素,删除最后一个元素,删除中间元素跟最后一个元素直接用指针进行就可以了,重点是删除头节点。
删除头节点可以有两种方式1、直接编写一段逻辑代码进行对头节点的删除
2、设置一个虚拟头结点,进行全部的的结点删除
编写代码:
1 class Solution { 2 public: 3 ListNode* removeElements(ListNode* head, int val) { 4 //进行设置一个虚拟结点,用于如果删除头节点,可方便操作 5 //相当于 虚拟头节点进行初始化 6 ListNode* dummyHead = new ListNode(0); 7 //将设置的虚拟头结点链接到本身的链表上 8 dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作 9 ListNode* cur = dummyHead; 10 11 while (cur->next != NULL) { 12 if(cur->next->val == val) { 13 ListNode* tmp = cur->next; 14 cur->next = cur->next->next; 15 delete tmp; 16 } else { 17 cur = cur->next; 18 } 19 } 20 return dummyHead->next; 21 } 22 };
另一种专门针对头节点在进行删除的代码:
抄录于:https://mp.weixin.qq.com/s/slM1CH5Ew9XzK93YOQYSjA
代码:
class Solution { public: ListNode* removeElements(ListNode* head, int val) { // 删除头结点 while (head != NULL && head->val == val) { // 注意这里不是if ListNode* tmp = head; head = head->next; delete tmp; } // 删除非头结点 ListNode* cur = head; while (cur != NULL && cur->next!= NULL) { if (cur->next->val == val) { ListNode* tmp = cur->next; cur->next = cur->next->next; delete tmp; } else { cur = cur->next; } } return head; } };
链表知识点巩固:
链表于数组对比,数组连续存储于内存,链表存储在内存空间中不是连续的,如果使用C/C++ 语言编写,记得在删除元素后,进行内存单元的释放(delete 结点),JAVA PYTHON语言则有自己的内存回收机制。