给你一个链表的头节点
head和一个整数val,请你删除链表中所有满足Node.val == val的节点,并返回 新的头节点 。


当头节点(新定义为prev)不为空时,进行遍历,此时再定义一个头尾节点(不在原链表基础上进行删改) 当头节点的val不是要删除的,直接进行尾插操作,如果判断链表为空(newHead==NULL),此时就让新头节点(newHaed)=新尾节点(NewTail)=prev,如果链表非空,prev的val直接尾插在尾节点的下一个节点,此时再让尾节点向后走一个节点即可,判断一个节点过后就可以让prev向后走一个节点再次进行上述判断,最后当prev为空,跳出循环,判断为尾节点不为空,就说明链表不为空,要将尾节点的下一个节点置为NULL,最后返回newHead即可

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val)
{
ListNode*newHead,*newTail;
newHead=newTail=NULL;
ListNode*prev=head;
while(prev)
{
//判断prev节点是否为val
if(prev->val!=val)
{
//尾插
if(newHead==NULL)
{
//链表为空
newHead=newTail=prev;
}
else
{
//链表非空
newTail->next=prev;
newTail=newTail->next;
}
}
prev=prev->next;
}
if(newTail)
newTail->next=NULL;
return newHead;
}时间复杂度:O(N)
完整代码源:
往期回顾:
总结:这道题运用到了数据结构——链表,相关链表的结构在之前数据结构初阶的学习中就已经给大家讲解过了,大家可以翻看之前的博客进行回顾总结,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。
最后送大家一句话来警醒自己:算法能力不是一蹴而就,而是通过一朝一夕的坚持刷题而积累的!