题目描述
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
本题思路
两种操作方式
- 直接使用原来的链表来进行删除操作。删除头节点和非头节点的操作不同,删除头节点直接将头节点head指针指向下一个元素并将之前的头节点释放
- 设置一个虚拟头结点在进行删除操作。统一了头节点与非头节点的删除操作
直接删除
代码如下:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 删除元素是头结点
while (head != NULL && head->val == val) { // 会不断的判断头节点或者说更换后的头节点是否为删除元素
ListNode* tmp = head;
head = head->next;
delete tmp;
}
// 删除元素是非头节点
ListNode* cur = head; // 用以存放head来遍历,不使用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;
}
};
虚拟头节点
代码如下:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode *dummyhead = new ListNode(0); //定义了一个头结点
dummyhead->next = head; //虚拟头节点与单链表链接
ListNode *cur = dummyhead; //只是单单指向了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;
}
}
head=dummyhead->next;
delete dummyhead;
return head;
}
};