我首先想到的就是哨兵法。
也就是建一个新的头结点(其数据域无任何意义)。
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节点,这是一个比较巧妙的方法,可以记一下,以后肯定有用。