赞
踩
?? 前情提要??
本章节是数据结构
的链表
的相关基础题目
讲解~
以下的内容一定会让你对链表
相关知识的题目,有一个颠覆性的认识哦!!!
以下内容以C语言
的方式实现
以下内容干货满满,跟上步伐吧~
作者介绍:
?? 作者: 热爱编程不起眼的小人物??
??作者的Gitee:代码仓库
??系列文章&专栏推荐: 《刷题特辑》、 《C语言学习专栏》、《数据结构_初阶》??我和大家一样都是初次踏入这个美妙的“元”宇宙?? 希望在输出知识的同时,也能与大家共同进步、无限进步??
??导航小助手??
大家可以跟着本文的题目讲解进行链表
相关知识的复习&加深
链表
还不太熟悉or需要回顾一下基本知识,可点击单链表、带头+双向+循环链表至相关文章进行回顾也欢迎大家上手测试一波??
??题目传送门:
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回新的头节点
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
??解题关键:
我们只需要遍历链表,一一比较结点的val
是否为要删除的
1若为要删除的结点:先释放掉此结点,再将此结点的上一结点链接到此结点的下一结点
2否则,继续遍历比较
特别注意:
因为单链表
只有后驱指针,无法像带头+双向+循环链表
轻易地直接访问某个结点的上一结点
所以遍历的时候需要同时安排前(prev)后(cur)指针,去记录上个结点和当前结点的位置
??特殊情况:
1如果第一个结点就是要删除的结点val
:这种情况下我们需要连头指针head
一起改变挪动
2如果整个链表全是要删除的结点val
,则也同样连头指针head
一起挪动
动图示例:
??实现:
struct ListNode* removeElements(struct ListNode*head, int val) { struct ListNode* cur = head; struct ListNode* prev = NULL; //边走边删除 //直至cur走到NULL就停止 while (cur) { //要删除结点时: if (cur->val == val) { struct ListNode* next = cur->next; //说明要删的是 第一个结点 if (prev == NULL) { free(cur); head = next; cur = next; } else { free(cur); prev->next = next; cur = next; } } //不需要删除结点时: else { prev = cur; cur = cur->next; } } return head; }
补充:
cur
来当循环的结束标志,当链表整体为NULL
的时候,cur
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。