给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
示例 1:
思路:
①直接使用原来的链表来进行删除操作。
②设置一个虚拟头结点在进行删除操作
①直接使用原来的链表来进行删除操作
移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。
所以头结点如何移除呢,其实只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点
最后,依然别忘将原头结点从内存中删掉。
操作方式是不一样,其实在写代码的时候也会发现,需要单独写一段逻辑来处理移除头结点的情况。
那么可不可以 以一种统一的逻辑来移除 链表的节点呢。
②设置一个虚拟头结点在进行删除操作
其实可以设置一个虚拟头结点,这样原链表的所有节点就都可以按照统一的方式进行移除了。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
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;
while(cur != NULL && cur->next != NULL)
{
if(cur->next->val == val)
{
ListNode *tmp1 = cur->next;
cur->next = cur->next->next;
delete tmp1;
}
else
{
cur = cur->next;
}
}
return head;
/*第二种方式采用虚拟头结点*/
// ListNode *dummyNode = new ListNode(0);
// dummyNode->next = head;
// ListNode *cur = dummyNode;
// 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 = dummyNode->next;
// delete dummyNode;
// return head;
}
};