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

力扣面试150(52/150)

8.10 82. 删除排序链表中的重复元素 II

给定一个已排序的链表的头 head删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表

我的思路:

最开始时想到的set,但是我发现并不是删除重复的让它不重复,而是删除全部重复的数字,这样的话用set就不现实了,因为无论如何都会保留下来一个的。所以我又想到了另外一个方法,使用自带的next指针,但是使用这个的话就要创建一个虚拟头节点,还要考虑很多边界问题。

大概的思路就是:如果carry.next.val === carry.next.next.val => 保存这个val然后进行遍历啊,一直到carry.next.val!==val的时候,在循环当中要做的就是修改carry的next指针

我的代码:

var deleteDuplicates = function(head) {// 新建虚拟链表let dummy = new ListNode();dummy.next = head;let carry = dummy;while(carry&& carry.next && carry.next.next){if(carry.next.val === carry.next.next.val){const x = carry.next.val;while(carry.next && carry.next.val === x){carry.next = carry.next.next;}}else {carry = carry.next;}}return dummy.next;
};

这里有一个注意的点:如果是返回的head,如果是head = [1,1,1,2,3]的情况,你就删除了head,head指针失效,所以返回head是没有用的

我的总结:这段代码通过引入一个虚拟头节点 dummy 来巧妙地处理链表删除所有重复节点的问题。它让一个 carry 指针从 dummy 开始向后遍历,当 carry 后面的两个节点值相等时,就找到了一个重复组。此时,它会记录下这个重复值,并不断地将 carrynext 指针向后移动,直到跳过所有该值的节点,从而实现整组删除。如果后面两个节点值不相等,说明当前节点是唯一的,carry 指针就正常后移一位。最终,无论原始的 head 节点是否被删除,dummy.next 始终指向处理完毕后链表的真正头部,保证了算法在各种情况下的正确性。

http://www.dtcms.com/a/324642.html

相关文章:

  • NY155NY170美光固态闪存NY175NY184
  • Zabbix优化指南:提升监控效率与性能
  • Pytorch深度学习框架实战教程-番外篇07-Pytorch优化器详解和实战指南
  • 机器学习——DBSCAN
  • 【人工智能99问】LLaMA的训练过程和推理过程是怎么样的?(22/99)
  • 【GPT入门】第43课 使用LlamaFactory微调Llama3
  • AI大模型提示词工程完全指南:从入门到精通
  • 【自用】JavaSE--IO流(二)--缓冲流、转换流、打印流、数据流、序列化流、IO框架
  • 硬件开发_基于STM32单片机的智能电梯系统
  • 【RocketMQ 生产者和消费者】- ConsumeMessageConcurrentlyService 并发消费消息
  • 自然语言处理入门路线-实践篇
  • AutoCAD 2026 的主要功能
  • 如何选择适合自己电商业务的 API?​
  • 解决RuoYi-Cloud项目ruoyi-system模块启动失败问题以及Naco容器部署问题
  • 【21】OpenCV C++实战篇——OpenCV C++案例实战二十七《角度测量》
  • SpringAI智能航空助手实战<Demo>
  • 《算法导论》第 17 章 - 摊还分析
  • XGBoost 与 GBDT 的比较:改进与性能提升
  • MATLAB绘制水的蒸汽压曲线(Antoine方程)
  • GitHub上为什么采用Gradle编译要多于Maven
  • DBSACN算法的一些应用
  • 【算法】图的 深度优先搜索(DFS)与 广度优先搜索(BFS)
  • Stream流应用
  • 学习分库分表的前置知识:高可用系统架构理论与实践
  • Java进阶之单列集合Set接口下的通用方法
  • Design Compiler:布图规划探索(ICC II)
  • LwIP的内存管理(1)
  • 密码学RSA取flag
  • 动态工作流:目标结构源自表
  • GeoJSON 介绍