leetcode203--移除链表元素

力扣原题链接

给你一个链表的头节点 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
}

时间复杂度如下图,可以看出时间很快,嘎嘎(๑•̀ㅂ•́)و✧

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值