算法leetcode|82. 删除排序链表中的重复元素 II(rust重拳出击)

news2024/11/17 22:41:12

文章目录

  • 82. 删除排序链表中的重复元素 II:
    • 样例 1:
    • 样例 2:
    • 提示:
  • 分析:
  • 题解:
    • rust:
    • go:
    • c++:
    • python:
    • java:


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

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

样例 1:

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

样例 2:

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

提示:

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

分析:

  • 面对这道算法题目,二当家的再次陷入了沉思。
  • 这道题目和 83. 删除排序链表中的重复元素 很像,但是要难一些。
  • 同样是有序的,所有相同数值的节点会连在一起。
  • 同样链表有可能不存在任何节点,不用做任何处理。
  • 但是由于是要删除 所有重复数字的节点 ,也就是说不能仅仅比较当前节点和下一个节点,而是要比较下一个节点和下下一个节点的值,因为下一个节点也是有可能要删除的,而单向链表又仅仅只能单向遍历,所以必须保留要删除节点的前一个节点的指针,尤其要注意的就是头节点也是有可能要被删除的,但是它显然没有前一个节点,为了能统一处理,一般是建立一个虚拟节点(也可以叫做哑节点,或者哨兵节点),当作头节点,这样就可以统一处理流程。
  • 同样要对rust说两句,可能是我的水平太差了,rust的题解写的超级长,非常啰嗦,但是那又怎么样,安全第一,rust是最棒的,难学一点是应该的,有本事你改良它。

题解:

rust:

// Definition for singly-linked list.
// #[derive(PartialEq, Eq, Clone, Debug)]
// pub struct ListNode {
//   pub val: i32,
//   pub next: Option<Box<ListNode>>
// }
//
// impl ListNode {
//   #[inline]
//   fn new(val: i32) -> Self {
//     ListNode {
//       next: None,
//       val
//     }
//   }
// }
impl Solution {
    pub fn delete_duplicates(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        if head.is_none() {
            return head;
        }

        let mut dummy = Option::Some(Box::new(ListNode::new(0)));
        dummy.as_mut().unwrap().next = head;

        let mut cur = dummy.as_mut().unwrap();
        while cur.next.is_some() && cur.next.as_ref().unwrap().next.is_some() {
            if cur.next.as_ref().unwrap().val == cur.next.as_ref().unwrap().next.as_ref().unwrap().val {
                let v = cur.next.as_ref().unwrap().val;
                while cur.next.is_some() && cur.next.as_ref().unwrap().val == v {
                    cur.next = cur.next.as_mut().unwrap().next.take();
                }
            } else {
                cur = cur.next.as_mut().unwrap();
            }
        }

        return dummy.unwrap().next;
    }
}

go:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteDuplicates(head *ListNode) *ListNode {
if head == nil {
		return nil
	}

	dummy := &ListNode{0, head}

	cur := dummy
	for cur.Next != nil && cur.Next.Next != nil {
		if cur.Next.Val == cur.Next.Next.Val {
			v := cur.Next.Val
			for cur.Next != nil && cur.Next.Val == v {
				cur.Next = cur.Next.Next
			}
		} else {
			cur = cur.Next
		}
	}

	return dummy.Next
}

c++:

/**
 * 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* deleteDuplicates(ListNode* head) {
        if (!head) {
            return head;
        }

        ListNode *dummy = new ListNode(0, head);

        ListNode *cur = dummy;
        while (cur->next && cur->next->next) {
            if (cur->next->val == cur->next->next->val) {
                int v = cur->next->val;
                while (cur->next && cur->next->val == v) {
                    cur->next = cur->next->next;
                }
            } else {
                cur = cur->next;
            }
        }

        return dummy->next;
    }
};

python:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return head

        dummy = ListNode(0, head)

        cur = dummy
        while cur.next and cur.next.next:
            if cur.next.val == cur.next.next.val:
                v = cur.next.val
                while cur.next and cur.next.val == v:
                    cur.next = cur.next.next
            else:
                cur = cur.next

        return dummy.next


java:

/**
 * Definition for singly-linked list.
 * 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; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return null;
        }

        final ListNode dummy = new ListNode(0, head);

        ListNode cur = dummy;
        while (cur.next != null && cur.next.next != null) {
            if (cur.next.val == cur.next.next.val) {
                int v = cur.next.val;
                while (cur.next != null && cur.next.val == v) {
                    cur.next = cur.next.next;
                }
            } else {
                cur = cur.next;
            }
        }

        return dummy.next;
    }
}

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】三连走一波~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


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

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

相关文章

开发者职场“生存状态”大调研报告分析 - 第一版

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…

三轮技术面 +HR 面,字节跳动面试也不过如此......

前言 人人都有大厂梦&#xff0c;对于软件测试人员来说&#xff0c;BAT 为首的一线互联网公司肯定是自己的心仪对象&#xff0c;毕竟能到这些大厂工作&#xff0c;不仅薪资高待遇好&#xff0c;而且能力技术都能够得到提升&#xff0c;最关键的是还能够给自己镀上一层金&#…

Unity中Shader的光照衰减

文章目录 前言一、衰减原理1、使用一张黑白渐变贴图用于纹理采样2、把模型从世界坐标转化为灯光坐标&#xff08;即以灯光为原点的坐标系&#xff09;3、用转化后的模型坐标&#xff0c;对黑白渐变纹理进行纹理采样4、最后&#xff0c;把采样后的结果与光照模型公式的结果相乘输…

PBA.客户需求分析管理

1 需求的三个层次: Requirement/Wants/Pains 大部分人认为&#xff0c;产品满足不了客户需要&#xff0c;是因为客户告知的需求是错误的&#xff0c;这听起来有一些道理&#xff0c;却没有任何意义。不同角色对于需求的理解是不一样的。在客户的需求和厂家的需求之间必然有一定…

分布式文件服务器——Windows环境MinIO的三种部署模式

上节简单聊到MinIO&#xff1a;分布式文件存储服务——初识MinIO-CSDN博客&#xff0c;但没具化&#xff0c;本节开始展开在Windows环境下 MinIO的三种部署模式&#xff1a;单机单节点、单机纠删码、集群模式。 部署的几种模式简要概括 所谓单机单节点模式&#xff1a;即MinI…

什么是谐波?谐波的危害

一、什么是谐波&#xff1f; “谐波”一词起源于声学。有关谐波的数学分析在18世纪和19世纪已经奠定了良好的基础。傅里叶等人提出的谐波分析方法至今仍被广泛应用。电力系统的谐波问题早在20世纪20年代和30年代就引起了人们的注意。当时在德国&#xff0c;由于使用静止汞弧变流…

PCL源码分析:直通滤波

文章目录 一、简介二、源码分析三、小结参考资料一、简介 让我们从一个最简单的功能开始慢慢重新认识PCL~~,虽然这个功能很简单,但是已可以从中管中窥豹来更加深入了解PCL的内部结构。 二、源码分析 在真正看PCL的源代码之前,我们先简单的看一下直通滤波这个类的类关系: 这…

自适应前照灯系统控制器AFS

自适应前照灯控制系统&#xff08;Adaptive Front-lighting System&#xff0c;简称AFS&#xff09;是一种智能灯光调节系统。通过感知驾驶员操作、车辆行驶状态、路面变化以及天气环境等信息&#xff0c;AFS 自动控制前照灯实时进行上下、左右照明角度的调整&#xff0c;为驾驶…

新的“HTTP/2 Rapid Reset”0day攻击打破了DDoS记录

导语 最近&#xff0c;一种名为“HTTP/2 Rapid Reset”的DDoS&#xff08;分布式拒绝服务&#xff09;攻击技术成为了热门话题&#xff0c;该技术自8月份以来被积极利用作为零日漏洞&#xff0c;打破了以往的攻击记录。亚马逊网络服务&#xff08;Amazon Web Services&#xff…

pytoch M2芯片测试

今天才发现我的新片是M2芯片&#xff0c;而不是M1芯片&#xff0c;有点尴尬 参考网址 https://www.oldcai.com/ai/pytorch-train-MNIST-with-gpu-on-mac/ 测试结果如下 M2_cpu.py # https://www.oldcai.com/ai/pytorch-train-MNIST-with-gpu-on-mac/ import torch from tor…

WebRTC 系列(四、多人通话,H5、Android、iOS)

WebRTC 系列&#xff08;三、点对点通话&#xff0c;H5、Android、iOS&#xff09; 上一篇博客中&#xff0c;我们已经实现了点对点通话&#xff0c;即一对一通话&#xff0c;这一次就接着实现多人通话。多人通话的实现方式呢也有好几种方案&#xff0c;这里我简单介绍两种方案…

Linux开启SSH

Linux开启SSH 1.虚拟机确定连通性 如果是虚拟机的话则需要进行确定和宿主主机之间能正常联通(不能联通还远程个啥) 获取到虚拟机的IP 参考文章:Linux获取本机IP地址使用宿主机ping一下虚拟机的IP查看是否联通 2.安装SSH服务端 安装工具来使得能够通过SSH进行连接 命令 sudo a…

【推荐系统】推荐系统(RS)与大模型(LLM)的结合

【推荐系统】推荐系统&#xff08;RS&#xff09;与大模型&#xff08;LLM&#xff09;的结合 文章目录 【推荐系统】推荐系统&#xff08;RS&#xff09;与大模型&#xff08;LLM&#xff09;的结合1. 主流的推荐方法2. 大模型&#xff08;LLM&#xff09;可能作用的地方 1. 主…

Spring源码解析——ApplicationContext容器refresh过程

正文 在之前的博文中我们一直以BeanFactory接口以及它的默认实现类XmlBeanFactory为例进行分析&#xff0c;但是Spring中还提供了另一个接口ApplicationContext&#xff0c;用于扩展BeanFactory中现有的功能。 ApplicationContext和BeanFactory两者都是用于加载Bean的&#x…

graphviz 绘制单链表

dot 代码 digraph LinkedList {rankdirLR; // 设置布局方向为从左到右&#xff08;左侧到右侧&#xff09;node [fontname"Arial", shaperecord, stylefilled, color"#ffffff", fillcolor"#0077be", fontsize12, width1.5, height0.5];edge [fo…

汉诺塔问题:递归

经典汉诺塔问题 汉诺塔问题是经典的可以用递归解决的问题。 汉诺塔(Hanoi)游戏规则如下&#xff1a;在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标&#xff1a;把A杆上的金盘全部移到C杆上&a…

系统架构师备考倒计时25天(每日知识点)

面向对象设计原则 单一职责原则&#xff1a;设计目的单一的类开放-封闭原则&#xff1a;对扩展开放&#xff0c;对修改封闭李氏(Liskov)替换原则&#xff1a;子类可以替换父类依赖倒置原则&#xff1a;要依赖于抽象&#xff0c;而不是具体实现&#xff1b;针对接口编程&#x…

【Redis】Redis持久化深度解析

原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 Redis持久化介绍RDB原理Fork函数与写时复制关于写时复制的思考 RDB相关配置 AOF原理AOF持久化配置AOF文件解读AOF文件修复AOF重写AOF缓冲区与AOF重写缓存区AOF缓冲区可以替代AOF重写缓冲区吗AOF相关配置写后…

机器学习之自训练协同训练

前言 监督学习往往需要大量的标注数据&#xff0c; 而标注数据的成本比较高 &#xff0e; 因此 &#xff0c; 利用大量的无标注数据来提高监督学习的效果有着十分重要的意义&#xff0e; 这种利用少量标注数据和大量无标注数据进行学习的方式称为 半监督学习 &#xff08; Semi…

Java 序列化和反序列化为什么要实现 Serializable 接口?

序列化和反序列化 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化. 反序列化&#xff1a;把字节序列恢复为对象的过程称为对象的反序列化. 什么时候需要用到序列化和反序列化呢或者对象序列化的两种用途… &#xff1a; (1) 对象持久化&#xff1a;把对象的…