leetcode-203.移除链表元素

在这里插入图片描述
我首先想到的就是哨兵法。
也就是建一个新的头结点(其数据域无任何意义)。

在这里插入图片描述

struct ListNode* removeElements(struct ListNode* head, int val)
{
	struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));//开辟一个空间设置一个结点
	struct ListNode* s;
	p->next = head;
	s = p;
	if (head == NULL)
		return NULL;
	while (s != NULL && (s->next) != NULL)
	{
		if (((s->next)->val) == val)
		{
			struct ListNode* pt = s->next;
			s->next = pt->next;
			pt->next = NULL;
			free(pt);
			head = p->next;
		}
		else
			s = s->next;
	}
	return head;
}

在leetcode上写链表题容易出现像
在这里插入图片描述
这样的错误,是因为可能会出现p或p->next为NULL的情况,所以如果要使用,就必须要依次判断。才能使用。

直接迭代法

struct ListNode* removeElements(struct ListNode* head, int val)
{
	struct ListNode* cur, * p;
	cur = head;
	if (head == NULL)
		return NULL;
	while (cur->next)
	{
		if (cur->next->val == val)
		{
			p = cur->next;
			cur->next = p->next;
			free(p);
		}
		else
			cur = cur->next;
	}
	return head->val == val ? head->next:head;
}

通过每个结点的指针判断是否等于val。
实际就像用head当作一个哨兵,让p指针去判断。
同时,用返回值去判断head节点,这是一个比较巧妙的方法,可以记一下,以后肯定有用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值