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

2023-09-20 11:03:54


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

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

样例 1:

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

样例 2:

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

提示:

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

分析:

  • 面对这道算法题目,二当家的再次陷入了沉思。
  • 本来要删除重复元素,需要两次遍历,或者额外空间的数据结构,比如映射表。
  • 但是题目中说是排序的,也就是说,相同的元素会挨在一起。
  • 如果是数组,那我们应该是轮训遍历,判断每个元素是否和前一个元素相同。
  • 但是题目中是排序链表,单向链表的特点是只能从前向后遍历,所以我们要判断的是当前元素和下一个元素是否相同,如果相同就删除下一个元素。
  • 要注意的是判断链表的结束,链表是没法直接知道长度的,需要一直遍历,判断是否到尾,通常是根据下一个节点是否为空来判断是否到达链表尾。
  • 另外还需要注意有可能链表没有任何节点,直接就是空,如果直接循环遍历判断下一个节点是否为空就会异常,所以先要做前置检查。
  • 每次写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 head = head;
        let mut cur = head.as_mut().unwrap();

        while cur.next.is_some() {
            if cur.val == cur.next.as_ref().unwrap().val {
                cur.next = cur.next.as_mut().unwrap().next.take();
            } else {
                cur = cur.next.as_mut().unwrap();
            }
        }

        return head;
    }
}

go:

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

	cur := head
	for cur.Next != nil {
		if cur.Val == cur.Next.Val {
			cur.Next = cur.Next.Next
		} else {
			cur = cur.Next
		}
	}

	return head
}

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 *cur = head;
        while (cur->next) {
            if (cur->val == cur->next->val) {
                cur->next = cur->next->next;
            } else {
                cur = cur->next;
            }
        }

        return head;
    }
};

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

        cur = head
        while cur.next:
            if cur.val == cur.next.val:
                cur.next = cur.next.next
            else:
                cur = cur.next

        return head


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;
        }

        ListNode cur = head;
        while (cur.next != null) {
            if (cur.val == cur.next.val) {
                cur.next = cur.next.next;
            } else {
                cur = cur.next;
            }
        }

        return head;
    }
}

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


更多推荐

科目二倒车入库

调整座位和后视镜离合踩到底大腿小腿成130-140°上半身90-100°座椅高度能看到前方全部情况后视镜调节到能看到后门把手,且后门把手刚好在后视镜上方边缘、离车1/3处。保持直线:前进:车仪表盘中央的原点和地面上的黄线擦边,这就是离右侧30-40cm倒车:右后视镜中一个手指的宽度对应地面15cm倒车观察右后视镜,车门

1.什么是jwt?jwt的作用是什么?2.jwt的三个部分是什么?三者之间的关系如何?3.JWT运行的流程是什么

1.**什么是JWT?JWT的作用是什么?**JWT(JSONWebToken)是一种用于在不同系统或组件之间传输信息的紧凑且安全的标准。它的作用主要有两个方面:-**身份验证(Authentication)**:JWT通常用于验证用户的身份。当用户登录时,服务器会生成一个JWT,并将其发送给客户端。客户端随后在每个请

按钮和文本框事件监听

事件监听:当某个事情发生的时候,干什么一、按钮Button监听publicclassTestActionEvent{publicstaticvoidmain(String[]args){//按下按钮,触发一些事件Frameframe=newFrame();//弹窗的监听事件/*frame.addWindowListen

如何使用国际站腾讯云服务器进行手机测速

怎么运用腾讯云服务器进行手机测速,包括挑选适宜的服务器、装置测速软件、设置测验参数等过程。腾讯云服务器是一款高性能、高可靠性的云核算服务,能够满足用户在不同场景下的需求。而在手机测速方面,腾讯云服务器相同有着出色的表现。本文将介绍怎么运用腾讯云服务器进行手机测速,帮助用户了解自己的网络速度。首要,挑选适宜的服务器是进行

HTTPS的加密流程

对称加密:只有一个密钥。加密:明文+密钥=>密文;解码:密文+密钥=>明文。非对称加密:有两个密钥,一个公钥,一个私钥。加密:明文+公钥=>密文;解码:密文+私钥=>明文;或加密:明文+私钥=>密文;解码:密文+公钥=>明文。HTTPS的基本工作过程:加密:针对HTTP的各种header和body1.使用对称密钥,来保

正则匹配手机、邮箱、密码

正则匹配手机、邮箱、密码publicabstractclassRegexPatterns{/***手机号正则*/publicstaticfinalStringPHONE_REGEX="^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";/***邮箱

Redis 全景解析

Redis解析信息图什么是Redis?Redis("REmoteDIctionaryService"的缩写)是一个开源的键值数据库服务器。对Redis最准确的描述是它是一个数据结构服务器。Redis的这种特定性质使其在开发人员中非常受欢迎和广泛采用。与其对行进行迭代、排序和排列,不如从头开始使用数据结构来存储数据?早期

spark的资源调整参数

–基础资源setspark.driver.memory=15g;setspark.driver.cores=3;setspark.driver.memoryOverhead=4096;setspark.executor.memory=5G;setspark.executor.memoryOverhead=1024;se

淘宝分布式文件存储系统(一) -TFS

淘宝分布式文件存储系统(一)->>TFS目录:什么是文件系统文件存储的一些概念文件的结构系统读取文件的方式为什么采用大文件结构的原因文件系统:将我们的数据整合成目录或者文件,提供对文件的存取接口,基于文件的权限进行访问,简单的说,文件系统就是对文件进行管理的方式.文件存储的一些概念:扇区.存储数据的磁盘的最小单位,通常

lua环境搭建数据类型

lua作为一门计算机语言,从语法角度个人感觉还是挺简洁的接下来我们从0开始学习lua语言。1.首先我们需要下载lua开发工具包在这里我们使用的工具是luadist下载链接为:https://luadist.org/repository/下载后的压缩包解压后就能用。2.接下来就是老生常谈的配置环境变量步骤如下计算机高级系

Linux服务器自定义登陆提示信息

背景最近在搭建zookeeper和应用服务环境,需要配置很多东西,然后不同服务器的文件路径之类的东西可能会有一些不同,比较麻烦,就准备给每个服务器配置一个登陆提示,让每一个登陆的用户能很快了解配置信息和文件路径。1,/etc/issue/etc/issue是Linux终端登录的欢迎语句存储文件,/etc/issue的文

热文推荐