移除链表元素-力扣203题
移除链表元素
- 题目
- 思路
- C++代码
题目
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2: 输入:head = [], val = 1 输出:[]
示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]
思路
首先,删除某个节点,我们需要找到该节点的前驱。
注意这个节点可能是头结点。所以我们使用一个虚拟头结点来处理该题,让它指向head,这样无论要删除的结点是否是头结点,删法均相同,不需要做任何特殊处理。
待删除结点可能并非一个而是有多个存在,所以要用到while循环遍历,注意这里不能使用虚拟头结点直接遍历,否则会丢失头结点的位置。
最后,请不要忘记,c++需要释放内存。
C++代码
class Solution {
public:ListNode* removeElements(ListNode* head, int val) {ListNode* curHead = new ListNode(0);//设置虚拟头结点,方便删除curHead->next = head;//虚拟头结点指向头结点headListNode* cur = curHead;//负责遍历和删除while(cur->next != NULL){if(cur->next->val == val){ListNode* temp = cur->next;//用于临时存储要删除的结点,以便于释放内存cur->next = cur->next->next;delete temp;}else {cur = cur->next;}}head = curHead->next;//头结点指向虚拟头结点的下一个,即删除后的头结点位置delete curHead;//释放头结点内存return head;}
};