题意:删除链表中等于给定值 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
输出:[]
只需将链表中的地址指向所删除节点的下一个节点即可,注意C或C++编程的时候,所删除的节点不会自动释放,需要人为的delete手动释放以减少内存占用。
有如下链表操作的两种方式:
- 直接使用原来的链表来进行删除操作。
- 设置一个虚拟头结点在进行删除操作。
(1)使用原来的链表来删除节点
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
while(head != NULL && head->val == val)
{
ListNode* temp = head;
head = head -> next;
delete temp;
}
ListNode* it = head;
while(it != NULL && it -> next != NULL)
{
if(it->next->val == val )
{
ListNode* temp = it->next;
it->next = it->next->next;
delete temp;
}
else{
it = it->next;
}
}
return head;
}
};
其中第一个while循环为删除val在头结点的情况;第二个while循环为删除val不是头结点的情况。
(2)设置一个虚拟的头结点来进行删除操作
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
ListNode* cur = dummyHead;
while (cur->next != NULL) {
if(cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
} else {
cur = cur->next;
}
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};