给你一个链表的头节点 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 输出:[]
提示:
- 列表中的节点数目在范围
[0, 104]
内 1 <= Node.val <= 50
0 <= val <= 50
解题碎碎念
本题较为简单,值得一提的是为了保证头节点的处理与其他结点一致,常会加一个虚拟头节点dummyhead(本题中我用的是ans表示)。
此外,由于C++没有自动内存管理,所以在确定一个结点是要删除的结点时应该delete掉,但不用再将指针后移!!!如果当前结点不符合要求,才需要后移指针。
题目比较简单,就不再赘述了,有疑问的话欢迎大家评论或私聊交流呦^O^
代码示例:
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) {}
}; //结点类型
ListNode* removeElements(ListNode* head, int val)
{
ListNode* ans = new ListNode(-1); //虚拟头节点
ans->next = head;
ListNode* pre = ans, * cur = head;
while (cur!=NULL)
{
if (cur->val == val)
{
ListNode* tmp = cur;
pre->next = cur->next;
delete tmp;
cur = pre->next;
}
else
{
pre = cur;
cur = cur->next;
}
}
return ans->next; //ans是虚拟头节点,真正的头节点应该是ans->next
}
时间复杂度如下图,可以看出时间很快,嘎嘎(๑•̀ㅂ•́)و✧