当前位置: 首页 > article >正文

LeetCode - 203. 移除链表元素

目录

题目

解题思路

读者可能出现的错误写法

正确的写法


题目

203. 移除链表元素 - 力扣(LeetCode)

解题思路

使用哨兵节点:

  • 创建一个哨兵节点(dummy),将其next指向原链表头节点
  • 哨兵节点的作用是统一处理所有情况,特别是当头节点需要被删除时

双指针遍历:

  • 使用两个指针:prev(前一个节点)和cur(当前节点)
  • prev初始指向哨兵节点,cur初始指向头节点

删除匹配节点:

  • 遍历链表,当发现cur节点的值等于目标值时:
  • 将prev的next指向cur的next,跳过cur节点
  • 释放cur节点内存
  • 更新cur为prev的next
  • 如果cur节点值不等于目标值:
  • prev和cur都向前移动一步

返回新头节点:

  • 新的头节点是哨兵节点的next
  • 释放哨兵节点
  • 返回新头节点

时间和空间复杂度

  • 时间复杂度:O(n),需要遍历整个链表一次
  • 空间复杂度:O(1),只使用了常数额外空间

关键点

  • 使用哨兵节点简化了头节点可能被删除的情况处理
  • 正确处理指针移动,特别是在删除节点后的指针更新
  • 注意内存管理,删除节点时释放内存

读者可能出现的错误写法

class Solution {
public:ListNode* removeElements(ListNode* head, int val) {ListNode* dummy = new ListNode(0);dummy ->next = head;ListNode* prev = dummy;ListNode* cur = head;while(cur!=nullptr){if(cur==val){prev->next = cur->next;}prev = cur;cur = cur->next;}ListNode* newhead = dummy->next;delete dummy;return newhead;}
};

if(cur==val) 这里你是在比较指针cur和整数val,这是错误的。应该比较节点的值:if(cur->val==val) 

在删除节点后,指针移动逻辑也有问题。当找到要删除的节点时,你应该更新cur但不更新prev。

正确的写法

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeElements(ListNode* head, int val) {ListNode* dummy = new ListNode(0);dummy ->next = head;ListNode* prev = dummy;ListNode* cur = head;while(cur!=nullptr){if(cur->val==val){prev->next = cur->next;delete cur;cur = prev->next;}else{prev = cur;cur = cur->next;}}ListNode* newhead = dummy->next;delete dummy;return newhead;}
};

http://www.lryc.cn/news/2394958.html

相关文章:

  • canvas 实现全屏倾斜重复水印
  • vue3项目 前端文件下载的两种工具函数
  • SpringAI系列 - 升级1.0.0
  • 5.31 day33
  • Vue3 + VTable 高性能表格组件完全指南,一个基于 Canvas 的高性能表格组件
  • 【七. Java字符串操作与StringBuilder高效拼接技巧】
  • 题解:洛谷 P12672 「LAOI-8」近期我们注意到有网站混淆视听
  • HTML 计算网页的PPI
  • WIN11+eclipse搭建java开发环境
  • Linux 环境下C、C++、Go语言编译环境搭建秘籍
  • MMR-Mamba:基于 Mamba 和空间频率信息融合的多模态 MRI 重建|文献速递-深度学习医疗AI最新文献
  • 2.5/Q2,Charls最新文章解读
  • Unity QFramework 简介
  • C++ 日志系统实战第五步:日志器的设计
  • @Docker Compose部署Alertmanager
  • 前端面试准备-3
  • 性能测试-jmeter实战1
  • 汽车高速通信的EMC挑战
  • [SC]SystemC在CPU/GPU验证中的应用(五)
  • [蓝桥杯C++ 2024 国 B ] 立定跳远(二分)
  • 现代网络安全攻防技术与发展现状
  • 杏仁海棠花饼的学习日记第十四天CSS
  • ESP8266远程控制:实现网络通信与设备控制
  • RabbitMQ监控:关键技术、技巧与最佳实践
  • 【机器学习基础】机器学习入门核心算法:隐马尔可夫模型 (HMM)
  • zookeeper 操作总结
  • golang 实现基于redis的并行流量控制(计数锁)
  • Leetcode 2819. 购买巧克力后的最小相对损失
  • AI炼丹日志-25 - OpenAI 开源的编码助手 Codex 上手指南
  • AnyConv OGG 转换器:轻松转换音频格式