移除链表元素
方法一(双指针遍历链表,是val就删除)
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* cur = head, *prev = NULL;
while(cur)
{
if(cur->val==val)
{
//1.头删
if(cur == head)
{
head = head->next;
free(cur);
cur = head;
}
//2.非头删
else
{
prev->next = cur->next;
free(cur);
cur = prev->next;
}
}
else
{
prev = cur;
cur = cur->next;
}
}
return head;
}
方法二(创建新链表,不是val就尾插)
单链表只适合头插头删,如果要尾插尾删的话需要找尾,效率太低,这里引入尾指针tail,这样的话可以提高尾插效率
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* cur = head;
struct ListNode* newhead = NULL, *tail = NULL;
while(cur)
{
if(cur->val != val)//相等就尾插
{
if(tail == NULL)
{
newhead = tail = cur;
}
else
{
tail->next = cur;
tail = tail->next;
}
cur = cur->next;
}
else
{
struct ListNode* del = cur;
cur = cur->next;
free(del);
del = NULL;
}
}
//最后一个节点是val,就会出现野指针问题
if(tail)
tail->next = NULL;
return newhead;
}
链表调试: