算法17: 删除排序链表中的重复元素(升序链表去重)

news/2025/1/16 0:49:40/

一、需求

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

示例 1:

输入:head = [1,1,2]

输出:[1,2]

示例 2:

输入:head = [1,1,2,3,3]
输出:[1,2,3]

提示:

  • 链表中节点数目在范围 [0, 300] 内
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

二、思路图

示例给出的链表示意图如下:

在这里插入图片描述

接着定义变量cur指向链表的头结点,表示当前考察的结点。

在这里插入图片描述

首先,看下cur指向的结点和其后一个结点的值是否相等,如果相等则表示其后一个结点需要删除。

在这里插入图片描述

具体方法是将cur指向的结点的后继指针,指向其下一个结点的下一个结点。这样就将重复结点删除了

在这里插入图片描述

如下图,就是去除重复结点1之后,链表的结构。

在这里插入图片描述

这时cur所指向的结点的下一个结点的值是2,与cur所指向的结点值不同。
在这里插入图片描述

因此,不需要去重,这时将cur指向下一个结点,继续考察。这时,cur所指向的结点之后,没有其它结点,因此去重结束。

在这里插入图片描述

三、代码

创建链表类

ListNode.java

import cn.hutool.core.util.StrUtil;/*** 链表类** @author 王子威* @date 2021/4/21*/
public class ListNode
{int val;ListNode next;ListNode() {}ListNode(int val) { this.val = val; }ListNode(int val, ListNode next) { this.val = val; this.next = next; }@Overridepublic String toString(){ListNode ln = this;StringBuilder sb = new StringBuilder();while(ln != null){if (StrUtil.isEmpty(sb)){sb.append("[" + ln.val);}else{sb.append("," + ln.val);}ln = ln.next;}sb.append("]");return sb.toString();}
}

测试接口

/*** 入口*      83. 删除排序链表中的重复元素*      1.创建升序链表* 输入:*      ListNode head = 1 -> 1 -> 2;* 输出:*      a.toString() = [1,2]* 解释:*      因为升序所以遇到下一个不同的值就是链接的地点*      我这里并未优化成上面概念*      这里的算法是:如果相同直接链接到下个节点,不然就直接复制临时值到下个节点*/
@Test
public void suanfa17()
{// 创建升序链表ListNode head = new ListNode(1);head.next = new ListNode(1);head.next.next = new ListNode(2);// 调用方法ListNode a = this.deleteDuplicates(head);// 这里重写了toStringSystem.out.println("a.toString() = " + a.toString());
}

调用方法:删除排序链表中的重复元素(链表去重)

/*** 删除排序链表中的重复元素(链表去重)** @param head* @return*/
public ListNode deleteDuplicates(ListNode head) {// 如果链表为空就直接返回nullif (head == null ) return null;// 不为空,复制头结点到临时节点ListNode temp = head;// 如果下一个节点不为空while(temp.next != null){// 临时节点值 = 下个节点的值if(temp.val == temp.next.val){// 将临时节点的链接到下下个节点上temp.next = temp.next.next;}else{// 否则将下个节点的值赋值给临时节点(因为节点不同)temp = temp.next;}}// 返回头节点return head;
}

作者:王子威

四、总结

  • 学习了删除排序链表中的重复元素(链表去重)算法
  • 测试用例废了点功夫,看来需要学习的还有很多
  • 创建链接方案
  • 获取链表的值
  • 链表只要返回头结点,我们就可以根据头结点的地址获取下个节点了
  • 算法兴趣+1 总:17
  • 加强了对算法的分析能力

http://www.ppmy.cn/news/334598.html

相关文章

Vue中如何进行数据筛选与搜索功能实现

Vue中如何进行数据筛选与搜索功能实现 在Vue应用中&#xff0c;数据筛选和搜索是常见的需求。本文将介绍如何在Vue中进行数据筛选和搜索功能的实现&#xff0c;包括基于原生JavaScript的筛选和搜索、基于Lodash库的筛选和搜索、以及基于Vue插件的筛选和搜索。 基于原生JavaScr…

Vue中如何进行图表绘制

Vue中如何进行图表绘制 数据可视化是Web应用中非常重要的一部分&#xff0c;其中图表绘制是其中的重要环节。Vue作为一款流行的前端框架&#xff0c;提供了很多优秀的图表库&#xff0c;以满足不同业务场景下的需求。本文将介绍如何在Vue中进行图表绘制&#xff0c;包括使用Vu…

【Deno】denon deno热重载框架

官网 https://deno.land/x/denon2.5.0 简介 denon是 deno 中 nodemon 的替代品。denon会监视文件的改变&#xff0c;并自动重新启动程序&#xff0c;重新编译更改的源代码。 安装 ⚠️ Make sure you are using deno version ^1.6.0 to install this executable. You can u…

离散数学编程作业:输出n元集合的所有划分或幂集元素

编程题目&#xff08;二选一&#xff09;&#xff1a; 打印输出n元&#xff08;n1,2,3,4,5,6&#xff09;集合的所有划分。打印输出n元&#xff08;n1,2,3,4,5,6&#xff09;集合的幂集中的所有元素。 编程内容及要求&#xff08;二选一&#xff09;&#xff1a; 编写程序&a…

【0基础自研记录】ESP32-CAM自制个人网络监控

目的&#xff1a;实现一个小型家庭监控 一、前期准备 1.硬件准备 esp32-acm烧录板烧录线 2.软件准备 Arduion IDE CH340串口驱动 下载地址如下 Arduion IDE:https://www.arduino.cc/en/software CH340串口驱动 链接&#xff1a;https://pan.baidu.com/s/1ri8dK7wW6KFz8rOPs…

win10笔记本电脑键盘没反应是哪个键锁了

原因一、部分字母打出来是数字&#xff0c;导致打不出 1 FnNUMLOCK切换法 我们先按住【Fn键】&#xff08;Fn键一般在键盘的左下角&#xff09;&#xff0c;再按【Num Lk】&#xff08;Num Lk一般在右上角&#xff0c;F11键的上面&#xff0c;当然不同的笔记本所在位置有所不同…

联想拯救者y7000键盘有几个按键失灵_y7000p键盘失灵

以联想拯救者y7000p为例&#xff0c;键盘失灵是系统有问题&#xff0c;联想笔记本都带着一键还原功能&#xff0c;只要没有重新安装过系统。一键还原按钮在笔记本左侧或者右侧&#xff0c;是一个很细的孔&#xff0c;进行还原系统即可。 键盘(Keyboard)是用于操作设备运行的一种…

兄弟mfc7220打印没反应_设备操作面板按键无反应

相关型号 DCP-110C, DCP-115C, DCP-120C, DCP-130C, DCP-145C, DCP-155C, DCP-165C, DCP-185C, DCP-330C, DCP-350C, DCP-385C, DCP-540CN, DCP-560CN, DCP-585CW, DCP-6690CW, DCP-7010, DCP-7025, DCP-7030, DCP-7040, DCP-7055, DCP-7057, DCP-7060D, DCP-8060, DCP-8070D, …