题目
给你一个链表的头节点 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;//虚拟头结点指向头结点head
ListNode* 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;
}
};