删除排序链表的重复元素I和II,多种解法和思考

删除排序链表的重复元素I

https://leetcode.cn/problems/remove-duplicates-from-sorted-list/description/

一个循环就可以了,如果当前节点和下一个节点值一样,当前节点不移动让next后移动一个,如果不一样则当前节点后移。

在这里插入图片描述

一个循环就可以了,如果当前节点和下一个节点值一样,当前节点不移动让next后移动一个,如果不一样则当前节点后移。

class Solution {public ListNode deleteDuplicates(ListNode head) {if(head==null)return head;ListNode cur = head;while(cur.next!=null){if(cur.val==cur.next.val)cur.next=cur.next.next;elsecur=cur.next;}return head;}
}
删除排序链表的重复元素II

https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/description/

在这里插入图片描述

学习到的新思想:

1、当不想要某个节点时,可以先找到前置节点然后cur.next=cur.next.next,这样子前面一个节点.next就可以跳过这个节点了,不再需要删除节点再定义两个节点了。为什么不能cur=cur.next;cur的空间始终存在,cur.next只是把空间指向了下一个节点罢了。

PS:当前指针不好改内存,.next指向的改变才是关键所在

2、当某个值得节点都不想要的时候,不要每一次都两个节点进行比较,看是不是两个节点的值一样。可以先开一个变量记录下来节点的值,然后再用1,就可以把所有节点全删了

class Solution {public ListNode deleteDuplicates(ListNode head) {if(head==null) return null;ListNode dummyNode = new ListNode(0,head);ListNode cur = dummyNode;//为什么可以指两次,其实如果不存在.next.next这个节点也不用删掉不是吗//这样子的变动是在链表head上面进行的//这里有一步很妙,先拿一个变量记录下来当前节点,然后就可以直接抛弃当前所有//节点,不要在两个节点进行比较while(cur.next!=null&&cur.next.next!=null){int val = cur.next.val;if(cur.next.val==cur.next.next.val)while(cur.next!=null&&cur.next.val==val)cur.next=cur.next.next;                elsecur = cur.next;}return dummyNode.next;}
}

自己的写法,单循环双节点计数法,先得到前面一个节点和当前节点,然后找到计数为1并且前后两个节点值不一样的位置,双节点再移动,又臭又长。

class Solution {public ListNode deleteDuplicates(ListNode head) {if(head==null) return null;//可能会有表头节点全部删除完了的情况,我们依旧采用虚拟节点的写法ListNode dummyNode = new ListNode(0,head);ListNode pre = dummyNode;ListNode cur = dummyNode.next;//删除节点,让pre指向下一个满足条件的节点即可int flag = 1;//计数器flag为1时候就可以赋值了while(cur.next!=null){if(cur.val==cur.next.val){flag++;cur.next=cur.next.next;}else{ if(flag==1){pre.next=cur;cur=cur.next;pre=pre.next;   }else{cur=cur.next;flag=1;  }}}if(flag==1) pre.next=cur;else pre.next=null;return dummyNode.next;}
}

优化了一下过程:

class Solution {public ListNode deleteDuplicates(ListNode head) {if(head==null) return null;ListNode dummyNode = new ListNode(0,head);ListNode pre = dummyNode;ListNode cur = head;while(cur!=null&&cur.next!=null){if(cur.val==cur.next.val){int val = cur.val;while(cur!=null&&cur.val==val)cur=cur.next;}else{pre.next=cur;pre=pre.next;cur=cur.next;}}pre.next=cur;return dummyNode.next;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码混淆的原理和方法详解

代码混淆的原理和方法详解摘要移动App的广泛使用带来了安全隐患,为了保护个人信息和数据安全,开发人员通常会采用代码混淆技术。本文将详细介绍代码混淆的原理和方法,并探讨其在移动应用开发中的重要性。 引言随着移动应用的普及,…

【hacker送书第6期】深入理解Java核心技术

第6期图书推荐 内容简介作者简介精彩书评参与方式 内容简介 《深入理解Java核心技术:写给Java工程师的干货笔记(基础篇)》是《Java工程师成神之路》系列的第一本,主要聚焦于Java开发者必备的Java核心基础知识。全书共23章&#xf…

高级IO—poll,epoll,reactor

高级IO—poll,epoll,reactor 文章目录 高级IO—poll,epoll,reactorpoll函数poll函数接口poll服务器 epollepoll的系统调用epoll_createepoll_ctlepoll_wait epoll的工作原理epoll的工作方式水平触发边缘触发 epoll服务器 reactor poll函数 poll函数是一个用于多路复用的系统调…

STM32之定时器--PWM控制SG90舵机

目录 1、PWM介绍 1.STM32F103C8T6 PWM资源: 2.PWM输出模式 3.PWM周期与频率 4.不同IO口输出PWM相对应连接到定时器的那一路 2、sg90舵机介绍及实战 1.sg90舵机介绍 2.代码实现 1.codeMX配置 2.用到的HAL库函数 1.开始产生PWM信号 返回状态值 2.修改比较…

AST反混淆实战|hcaptcha验证码混淆js还原分析

关注它,不迷路。 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除! 1.实战地址 https://newassets.hcaptcha.com/c/bc8c0a8/hsw.js 将上面…

Python+requests+Jenkins接口自动化测试实例

在做功能测试的基础上,我平时也会用postman测试接口,不过postman只能测试一个一个接口,不能连贯起来,特别是我们公司的接口很多都是要用到token的,导致我每次测个需要登录的接口都要去获取到token,做了很多…

Excle无法在受保护的视图中打开该文件

Excle无法在受保护的视图中打开该文件 解决方案:

【算法】链表-20231124

这里写目录标题 一、83. 删除排序链表中的重复元素二、206. 反转链表三、234. 回文链表 一、83. 删除排序链表中的重复元素 简单 1.1K 相关企业 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例…

(4)BUUCTF-web-[极客大挑战 2019]EasySQL1

前言: 觉得这个题目挺有意义的,因为最近在学数据库,但是不知道在现实中有什么应用,所以学起来也没有什么兴趣,做了这个题目,发现数据库还是挺有用处的,哈哈 知识点: mysql 中and和…

速记:一个保险丝检测电路

一个保险丝检测电路 保险丝熔断:红灯亮 保险丝正常:绿灯亮 同样的,仿真中的指示灯可以换成其他指示器件。

PTA-2023年软件设计综合实践_9(动态规划法)

7-1 数塔 数塔如图所示&#xff0c;若每一步只能走到相邻的结点&#xff08;图中有数字的方格&#xff09;&#xff0c;则从最顶层走到最底层所经过的所有结点的数字之和最大是多少&#xff1f;测试数据保证结果不大于231−1。 C #include <bits/stdc.h> using namespa…

IDEA插件:Apipost Helper使用

Apipost-Helper是由Apipost推出的IDEA插件&#xff0c;写完接口可以进行快速调试&#xff0c;且支持搜索接口、根据method跳转接口&#xff0c;还支持生成标准的API文档&#xff0c;注意&#xff1a;这些操作都可以在代码编辑器内独立完成&#xff0c;非常好用&#xff01;这里…

YOLOv8改进 | 2023 | DWRSeg扩张式残差助力小目标检测 (附修改后的C2f+Bottleneck)

论文地址&#xff1a;官方论文地址 代码地址&#xff1a;该代码目前还未开源&#xff0c;我根据论文内容进行了复现内容在文章末尾。 一、本文介绍 本文内容给大家带来的DWRSeg中的DWR模块来改进YOLOv8中的C2f和Bottleneck模块&#xff0c;主要针对的是小目标检测&#xff0c…

【GraphQL】什么是Prisma?

本页提供了Prisma及其工作原理的高级概述。 什么是Prisma&#xff1f; Prisma是一个开源的下一代ORM。它由以下部分组成&#xff1a; Prisma客户端&#xff1a;Node.js和TypeScript的自动生成和类型安全查询生成器Prisma迁移&#xff1a;迁移系统Prisma Studio:GUI&#xff0…

JVM——内存溢出和内存泄漏

目录 1. 内存溢出和内存泄漏内存泄漏的常见场景解决内存溢出的思路1.发现问题 – Top命令2.发现问题 – VisualVM3.发现问题 – Arthas4.发现问题 – Prometheus Grafana5.发现问题 – 堆内存状况的对比![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/058d113715b…

BIO、NIO、selector、Netty代码Demo示例

文章目录 &#xff08;一&#xff09;BIO&#xff08;Blocking I/O 阻塞I/O&#xff09;&#xff08;二&#xff09;NIO&#xff08;Non-Blocking I/O 非阻塞I/O&#xff09;&#xff08;三&#xff09;IO多路复用--Selector&#xff08;四&#xff09;Netty &#xff08;一&am…

【hacker送书第5期】SQL Server从入门到精通(第5版)

第5期图书推荐 内容简介作者简介图书目录参与方式 内容简介 SQL Server从入门到精通&#xff08;第5版&#xff09;》从初学者角度出发&#xff0c;通过通俗易懂的语言、丰富多彩的实例&#xff0c;详细介绍了SQL Server开发所必需的各方面技术。全书分为4篇共19章&#xff0c;…

优化机器学习:解析数据归一化的重要性与应用

在机器学习中&#xff0c;数据归一化是一种数据预处理的技术&#xff0c;旨在将数据转换为相似的范围或标准化的分布。这样做的主要目的是消除不同特征之间的量纲差异或数值范围差异&#xff0c;以确保模型在训练时更稳定、更有效地学习特征之间的关系。 通常&#xff0c;机器…

智能优化算法应用:基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.水循环算法4.实验参数设定5.算法结果6.参考文献7.…

安卓apk抓包

起因 手机&#xff08;模拟器&#xff09;有时候抓不到apk的包&#xff0c;需要借助Postern设置一个代理&#xff0c;把模拟器的流量代理到物理机的burp上。 解决方案 使用Postern代理&#xff0c;把apk的流量代理到burp。 Postern是一个用于代理和网络流量路由的工具&#xf…