删除排序链表的重复元素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.hqwc.cn/news/230812.html

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

相关文章

Testlink 1.9.20+phpstudy_pro安装遇到的问题

phpstudy_pro启动了Apache2.4.39和Mysql5.7.26,php的版本是7.3.4zai。 安装Testlink 1.9.19时没有数据库的问题,安装Testlink 1.9.20时遇到了数据库问题,如下图所示: 网上搜索“Failed!Mysql Database cannnot be used”,给出的…

Python接口自动化测试如何设计接口测试用例(详解)

简介 上篇我们已经介绍了什么是接口测试和接口测试的意义。在开始接口测试之前,我们来想一下,如何进行接口测试的准备工作。或者说,接口测试的流程是什么?有些人就很好奇,接口测试要流程干嘛?不就是拿着接口…

Java高级技术(动态代理)

一,代理 二,案例 放到代码中演示: 首先,创建一个明星接口,这个接口有一个skill方法,说明只要是明星就必须有点技能。 public interface Star {void skill(); } 然后,创建坤坤对象&#xff0c…

第一个C代码讲解

文章目录 编写C文件创建文本文件编写代码修改文件后缀切换文件路径 编译代码打开命令行使用gcc编译代码运行程序双击运行使用命令行运行 代码分析编译过程 编写C文件 编辑C代码文件的工具有很多,为了让大家初学的时候摆脱编译软件的干扰,更容易理解编译过…

JVM——产生内存溢出原因

目录 1.产生内存溢出原因一 :代码中的内存泄漏1.案例1:equals()和hashCode()导致的内存泄漏问题:**正常情况**:**异常情况:**解决方案: 2.案例2:内部类引用外部类问题:解决方案&…

VSCODE+QEMU+WSL调试RISCV代码(SBI、kernel)

前言 最近在对RISC-V架构比较感兴趣,正好手头有《RISC-V体系结构编程与实践》的书籍,就打算跟随笨叔将这块的知识学习起来,最开始当然是需要搭建一个基础的实验平台,本来笨叔是贴心的提供了VMare的环境,奈何天生叛逆的…

基于SSM的航空票务推荐系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

轻松整合Knife4j:快速搭建Swagger文档界面与接口调试

Knife4j 是一个为 Java 开发者提供的 Swagger 文档聚合工具,它是 Swagger-Bootstrap-UI 的升级版。它的主要功能是生成和展示 API 文档,让开发者能够更轻松地查看和测试接口。 整合 Knife4j(Swagger-Bootstrap-UI 的升级版)到 Spr…

接口性能测试 —— Jmeter并发与持续性压测

接口压测的方式: 1、同时并发:设置线程组、执行时间、循环次数,这种方式可以控制接口请求的次数 2、持续压测:设置线程组、循环次数,勾选“永远”,调度器(持续时间),这种…

电影特效合成软件NUKE 14 mac介绍说明

NUKE 14 mac是一款电影特效合成软件。可用于电影、电视和视频游戏行业,以创建高质量的视觉效果和动态图形。 Nuke拥有超过200个创意节点,提供您处理数字合成各种挑战所需的一切。这包括行业标准的键控器,旋光仪,矢量绘图工具&…

vmware虚拟机怎么安装linux-rocky操作系统

vmware虚拟机安装linux-rocky操作系统 rocky下载地址:https://rockylinux.org/zh_CN/download/ 我下载boot版本,安装时候需要联网。 接下来一路下一步,硬盘这里可以选择“将虚拟磁盘存储为单个文件”,然后一直点击到完成就可以。…

虾知(知虾):助力Shopee卖家实现市场分析和选品策略优化的神器

在如今的电商市场竞争激烈的背景下,卖家需要借助数据分析工具来了解市场需求、热销产品和竞争状况,以制定明智的选品策略。而虾知(知虾)作为一款专为Shopee卖家设计的数据分析工具,为卖家提供全面的市场分析、商品分析…