[Leetcode]删除链表中等于val 的所有结点
创始人
2024-06-02 08:40:56
0

力扣链接

方法一:

使用前后两个指针,cur指向当前位置,prev指向前一个位置,通过改变指向和释放结点来删除val

初步代码,还存在问题:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* prev = NULL;struct ListNode* cur = head;while(cur){if(cur->val != val){prev = cur;cur = cur->next;}else{prev->next = cur->next;free(cur);// cur = cur->next;//错误,cur已经被释放,野指针cur = prev->next;}}return head;}

null pointer出现了空指针

通过测试用例代码走读分析问题:

如果第一个就是要删的值,也就是头删,会出现问题

所以这种情况要单独处理

最终代码:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* prev = NULL;struct ListNode* cur = head;while(cur){if(cur->val != val){prev = cur;cur = cur->next;}else{if(prev == NULL){head = cur->next;free(cur);cur = head;}else{prev->next = cur->next;free(cur);//cur = cur->next;//和下一句等价,但是cur已经释放,这句会出现野指针cur = prev->next;}}}return head;//返回一个新的头,不需要用二级指针}

方法二:

把不是val的值尾插到新链表

初步代码:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* newHead= NULL,* tail = NULL;struct ListNode* cur = head;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* next = cur->next;free(cur);cur = next;}}return newHead;
}

通过走读代码我们发现,当最后一个结点的值为val时,释放节点后前面尾插的结点仍然指向最后一个结点,这里只需要将tail->next置空即可,修改后代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* newHead= NULL,* tail = NULL;struct ListNode* cur = head;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* next = cur->next;free(cur);cur = next;}}tail->next = NULL;return newHead;
}

但是代码仍然存在错误,运行如下:

显而易见,需要考虑链表为空的情况

改进后代码:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val)
{if(head== NULL){return NULL;}struct ListNode* newHead= NULL,* tail = NULL;struct ListNode* cur = head;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* next = cur->next;free(cur);cur = next;}}tail->next = NULL;return newHead;
}

报错:

这时代码直接指向最后一个else,此时tail为空,tail->next不合理,所以干脆前面不进行判断,而在后面对tail进行判断

最终代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* newHead= NULL,* tail = NULL;struct ListNode* cur = head;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* next = cur->next;free(cur);cur = next;}}if(tail){tail->next = NULL;}return newHead;
}

相关内容

热门资讯

巨亏63%后增聘蔡霖!招商资管... (转自:机构之家)5月12日,招商资管发布公告,旗下产品招商资管智远成长灵活配置混合型集合资产管理计...
医用耗材集采深化进行时:企业加... 21世纪经济报道记者 唐唯珂 广州报道五月以来,各地耗材集采持续深入,高值耗材之外,普耗也有所涉及。...
国办印发!2025年度立法工作... 转自:新华社新华社北京5月14日电 经党中央、国务院同意,国务院办公厅日前印发《国务院2025年度立...
杭州将足球纳入中考体考选考项目 格隆汇5月14日|杭州市政府官网近日公布《杭州市加快推进全国足球发展重点城市建设若干措施》。其中提到...
赋予新使命,机遇为何一再青睐“... 文/乐居财经 严明会5月8日,“格力地产”证券简称正式变更为“珠免集团(维权)”,这也标志着其稳妥推...
认养一头牛新推专业儿童品牌“哞... 近日,认养一头牛官宣旗下专业儿童品牌“哞星人”成立。并推出A2型儿童纯牛奶系列、A2型有机儿童纯牛奶...
宁德时代获超500亿美元机构认... 观点网讯:5月14日,宁德时代获机构下单超500亿美元,折合约3902亿港元,剔除基石认购部分后超额...
特朗普称美中贸易谈判成果将有利... 来源:环球网 【环球网报道】5月14日上午,国台办举行例行新闻发布会,发言人陈斌华就近期两岸热点问题...
公司称兼职者想无偿解约要看态度... 【#公司称兼职者想无偿解约要看态度# #大学生兼职配音0收入被索赔违约金# 】近日,南京大学生小...
三星计划在HBM4采用混合键合... 今年初有报道称,三星将从第10代V-NAND闪存开始,采用长江存储(YMTC)的专利混合键合技术。三...
淘宝上线新功能:屏蔽高退款人群 5月13日,有消息称,淘宝已上线“高退款人群屏蔽”功能,服饰商家可在自定义推广页面设置屏蔽人群,既可...
新华时评·锲而不舍落实中央八项... 据新华社北京5月14日电 日前,中央层面深入贯彻中央八项规定精神学习教育工作专班、中央纪委办公厅公开...
《长安三万里》在台湾地区上映并... 来源:环球网 【环球网报道】5月14日上午,国台办举行例行新闻发布会,发言人陈斌华就近期两岸热点问题...
特斯拉机器人展示复杂舞蹈能力:...   Hehson科技讯 5月14日上午消息,特斯拉擎天柱机器人在海外社交平台发布最新消息:“刚开始热...
党中央、国务院同意,印发! 转自:中国能源报中国政府网5月14日消息,《国务院2025年度立法工作计划》已经党中央、国务院同意并...
联想青春有AI大学生教育特惠计... 5月13日晚,联想在清华大学学生职业发展指导中心举办了一场特别的宣讲会——联想大学生AI精英挑战赛主...
危机四伏:210万加沙人被未爆... 据《耶路撒冷邮报》5月12日报道,以色列总理内塔尼亚胡暗示将继续扩大在加沙的作战行动。土耳其阿纳多卢...
英伟达要在沙特建AI工厂,黄仁... 当地时间5月13日,多家美国科技公司宣布与沙特达成人工智能交易。其中,英伟达和AMD引领了大规模的交...
“从1%到7%”,中国跨境电商... 近日,国务院发布批复,同意在海南全岛和秦皇岛等15个城市(地区)设立跨境电子商务综合试验区,同时撤销...
董事长涉短线交易遭立案,三年巨...   科创板的“明星”生物药企迈威生物(688062.SH)近日陷入双重风波:董事长兼总经理刘大涛因涉...