当前位置:网站首页>【C语言刷题】Leetcode203——移除链表元素
【C语言刷题】Leetcode203——移除链表元素
2022-08-02 18:32:00 【桦秋静】
Leetcode203——移除链表元素
题目描述
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
链接:Leetcode203
示例
示例 1:
**输入:**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 输出:[ ]
提示:
- 列表中的节点数目在范围 [0, 104] 内
- 1 <= Node.val <= 50
- 0 <= val <= 50
核心代码模式
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */
struct ListNode* removeElements(struct ListNode* head, int val)
{
}
思路分析与代码实现
1.前后指针原地修改法
要删掉值为val的结点,那我们就遍历链表,遇到符合条件的结点就删掉。毕竟是要删掉结点,那就设置两个指针prev和cur一前一后。cur不为NULL就一直找下去,找到要删除结点时,要注意一下是不是头结点,要是头结点的话就就是头删了,先把cur下一个结点地址给头指针head,释放掉cur位置的结点,再把head值给cur让它指向下一个结点;若不是头结点,那就先把cur下一个结点地址给prev的next指针,让prev指向cur下一个结点,释放掉cur位置的结点,再把prev下一个结点的地址给cur,让它指向下一个结点。没找到要删除的结点的话就继续找下去。
代码实现
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* prev = head;
struct ListNode* cur = head;
while(cur)
{
if(cur->val == val)
{
if(cur == head)
{
head = cur->next;
free(cur);
cur = head;
}
else
{
prev->next = cur->next;
free(cur);
cur = prev->next;
}
}
else
{
prev = cur;
cur = cur->next;
}
}
return head;
}
2.新链表尾插法
可不可以新建一个链表,定义新的头指针为newHead,然后就把值不等于val的结点放到新链表去,等于val的结点我们把它释放掉,所以我们要一个指针来遍历链表,定义cur指针。这里把值不等于val的结点放到新链表用的是尾插,那好了,尾插要是还要来个指针一个一个去找前一结点可太麻烦了,不妨定义一个尾指针tail用来指向新链表的尾部,这样尾插就方便多了。要注意有个坑,尾插到最后要记得把新链表最后一个结点的next指针给置为NULL。
代码实现
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* cur = head;
struct ListNode* newHead = NULL;
struct ListNode* tail = NULL;
while(cur)
{
if(cur->val != val)
{
if(tail == NULL)
{
newHead = cur;
tail = cur;
}
else
{
tail->next = cur;
tail = cur;
}
cur = cur->next;
}
else
{
struct ListNode* del = cur;
cur = cur->next;
free(del);
}
}
if(tail)
tail->next = NULL;
return newHead;
}
试试带头链表
我们可以试试看用带头链表,头指的就是哨兵结点,不是用来存放有效数值的,而是用作辅助结点的。用哨兵结点在这有什么用呢?你想啊,之前不用它时是不是还要判断一下tail是不是NULL,但是用哨兵结点后tail至少是指向哨兵结点的,不会为NULL,是不是就省了点事?这里的哨兵结点我们命名为guard。
代码实现
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* cur = head;
struct ListNode* guard = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* tail = guard;
while(cur)
{
if(cur->val != val)
{
tail->next = cur;
tail = cur;
cur = cur->next;
}
else
{
struct ListNode* del = cur;
cur = cur->next;
free(del);
}
}
tail->next = NULL;
head = guard->next;
free(guard);
return head;
}
边栏推荐
- 洛谷P4316 绿豆蛙的归宿
- pydev debugger: warning: trying to add breakpoint to file that does not exist: /tmp/xxx
- Why young people are snapping up domestic iPhone, because it is much cheaper and more populist
- Win11dll文件缺失怎么修复?Win11系统dll文件丢失的解决方法
- WIFi 开关控制实现-ESP8266 物联网 android studio arduino QT多线程服务器
- How to deal with security risks posed by machine identities
- T5: Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
- 阿里测试8年经验,靠着这份理解,我才得以生存下来
- What skills are the most practical for college students in communications?
- 如何确保智能工厂的安全?
猜你喜欢
随机推荐
LeetCode 1947. 最大兼容性评分和(状态枚举DP)
LeetCode每日一题(324. Wiggle Sort II)
编译型语言与解释型语言的区别
读书笔记之《你想过怎样的一生?》
中断向量表概述
荐号 | 当一个人不联系你,不拉黑你,原因只有一个……!
【动态规划专项训练】基础篇
手机银行体验性测试:如何获取用户真实感受
C#里如何简单的校验时间格式
香农与信息论三大定律
天翼云4.0来了!千城万池,无所不至!
喜迎八一 《社会企业开展应聘文职人员培训规范》团体标准出版发行会暨橄榄枝大课堂上线发布会在北京举行
Win11dll文件缺失怎么修复?Win11系统dll文件丢失的解决方法
请教一个数据库连接池的问题,目前已知是事务未设置超时,又有一块代码事务没有提交,一直把连接给耗尽了,
电子行业库存管理痛点与WMS仓储管理系统解决方案
Interviewer: can you talk about optimistic locking and pessimistic locks
深入理解IO流(第一篇)
DevOps之代码检查
中国科学院院属研究单位
AtomicInteger详解