小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
203. 移除链表元素
给你一个链表的头节点
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
输出: []
解题方法
这里有两种操作链表的方式:
- 直接使用原来的链表来进行删除操作
- 设置一个虚拟头节点,再进行删除操作
不设置虚拟头节点
/**
* 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) {
// 1、删除头节点
while (head != NULL && head->val == val)
{
ListNode *tmp = head;
head = head->next;
delete tmp;
}
// 2、删除其他节点(非头节点)
ListNode *cur = head;
// 非头节点,cur初始指向头节点,所以查找cur后面的节点的值是否为val
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;
}
};
设置虚拟头节点
/**
* 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) {
// 设置一个虚拟头节点
ListNode *dummyHead = new ListNode(0);
// 将虚拟头节点的next指针指向head , 方便后面的操作
dummyHead->next = 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;
}
};
【参考】:代码随想录