【LeetCode每日一题】:移除链表元素
🔥个人主页:Cx330🌸
❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》
🌟心向往之行必能至
🎥Cx330🌸的简介:
目录
题目链接:
题目描述:
示例:
思路:
图解:
代码实现:
复杂度分析:
题目链接:
203.移除链表元素-力扣(LeetCode)
题目描述:
给你一个链表的头节点
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节点是否为valif(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)
完整代码源:
【CPP知识学习仓库】 - Gitee.com
往期回顾:
【数据结构初阶】--双向链表(一)
【数据结构初阶】--双向链表(二)
总结:这道题运用到了数据结构——链表,相关链表的结构在之前数据结构初阶的学习中就已经给大家讲解过了,大家可以翻看之前的博客进行回顾总结,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。
最后送大家一句话来警醒自己:算法能力不是一蹴而就,而是通过一朝一夕的坚持刷题而积累的!