【算法训练-链表 四】【删除】:删除链表的倒数第N个节点、删除有序链表中的重复元素、删除有序链表中的重复元素II

news2025/1/11 5:58:39

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【删除有序链表中的重复元素】,使用【链表】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公司+最近一年+出现频率排序,由高到低的去牛客TOP101去找,只有两个地方都出现过才做这道题(CodeTop本身汇聚了LeetCode的来源),确保刷的题都是高频要面试考的题。

在这里插入图片描述

名曲目标题后,附上题目链接,后期可以依据解题思路反复快速练习,题目按照题干的基本数据结构分类,且每个分类的第一篇必定是对基础数据结构的介绍

删除链表的倒数第N个节点【MID】

来解决这道MID题目

题干

直接粘题干和用例

输入:
{1,2},2    

返回值:
{2} 

解题思路

给出解题思路
在这里插入图片描述
算法实现步骤如下:

  1. fast快指针先行N步和慢指针拉开N个节点距离
  2. fast和slow指针一直向前直到快指针到链表的尾节点停止,此时慢指针因为落后快指针N个节点,所以在链表的倒数第N+1个位置
  3. slow指针直接指向其下一个节点的下一个,将下一个节点从链表中删除

注意这里为什么用了虚拟头结点作为哨兵,如果要删除的是倒数第5个节点也就是头节点,按照上述算法将无法处理,所以需要设置一个虚拟头节点

代码实现

给出代码实现基本档案

基本数据结构链表
辅助数据结构
算法迭代
技巧双指针

其中数据结构、算法和技巧分别来自:

  • 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
  • 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
  • 技巧:双指针、滑动窗口、中心扩散

当然包括但不限于以上

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @param n int整型
     * @return ListNode类
     */
    public ListNode removeNthFromEnd (ListNode head, int n) {
        // 1 入参校验及哨兵节点设置
        if (head == null) {
            return null;
        }
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;

        // 2 定义快慢指针,都从表头出发
        ListNode fast = dummyNode;
        ListNode slow = dummyNode;

        // 3 快指针先行N步,拉开与慢指针N个节点间隔
        while (n > 0) {
            fast = fast.next;
            n--;
        }

        // 4 快慢指针同时前进,当快指针到链表尾部的时候,慢指针就对应倒数第N个节点的前一个节点,因为快慢指针拉开的是N个节点距离
        while (fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;

        return dummyNode.next;
    }

}

复杂度分析

时间复杂度:由于只遍历了一遍,所以时间复杂度为O(N)
空间复杂度:由于没有用到辅助空间,所以空间复杂度为O(1)

删除有序链表中的重复元素【EASY】

先来个简单的热热身

题干

直接粘题干和用例

解题思路

比较简单,由于链表有序,则重复元素一定相邻,删除重复元素即可。
在这里插入图片描述

代码实现

给出代码实现基本档案

基本数据结构链表
辅助数据结构
算法迭代
技巧

其中数据结构、算法和技巧分别来自:

  • 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
  • 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
  • 技巧:双指针、滑动窗口、中心扩散

当然包括但不限于以上

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode deleteDuplicates (ListNode head) {
        // 1-单指针进行链表遍历
        ListNode cur = head;
        while (cur != null && cur.next != null) {
            // 2-只有当前节点和下一节点都不为null才能进行val比较
            if (cur.val == cur.next.val) {
                // 2-1 比较一致则删除下一个节点
                cur.next = cur.next.next;
            } else {
                // 2-2 比较不一致则继续向前搜索,直到cur到链表尾部
                cur = cur.next;
            }

        }
        return head;
    }
}

复杂度分析

时空复杂度分析

  • 时间复杂度:遍历一遍链表,所以时间复杂度O(N)
  • 空间复杂度:未用到辅助结构,所以空间复杂度O(1)

删除有序链表中的重复元素II【MID】

难度升级,和上一题的区别是把重复的元素全部干掉而不是留一个,所以需要有pre指针记录重复节点的上一个

题干

直接粘题干和用例

解题思路

给出解题思路,最好有图
这里需要注意虽有有两个while,但是内层的while是去重用的,它前进的时候也会影响到外层循环,所以总体时间复杂度就不是O(N^2),而是O(N)

代码实现

给出代码实现基本档案

基本数据结构链表
辅助数据结构
算法迭代
技巧双指针

其中数据结构、算法和技巧分别来自:

  • 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
  • 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
  • 技巧:双指针、滑动窗口、中心扩散

当然包括但不限于以上

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode deleteDuplicates (ListNode head) {
        // 1 入参校验
        if (head == null || head.next == null) {
            return head;
        }
        // 2 设置哨兵节点
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode pre = dummy;
        ListNode cur = head;
        // 3 双指针遍历
        while (cur != null && cur.next != null) {
            if (cur.val != cur.next.val) {
                // 1-比较不一致则继续前进
                cur = cur.next;
                pre = pre.next;

            } else {
                // 2-比较一致则cur继续向前直到直到不一致的为止
                while ( cur != null && cur.next != null && cur.val == cur.next.val) {
                    cur = cur.next;
                }
                // 3-删除中间所有的重复节点,cur继续指向新节点
                pre.next = cur.next;
                cur = cur.next;
            }

        }
        return dummy.next;
    }
}

复杂度分析

时空复杂度分析

  • 时间复杂度:这里需要注意虽有有两个while,但是内层的while是去重用的,它前进的时候也会影响到外层循环,所以总体时间复杂度就不是O(N^2),而是O(N)
  • 空间复杂度:没有借助外部结构,空间复杂度为O(1)

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

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

相关文章

全国快递查询接口文档-v2,快递,全球快递,配送,物流管理,物流数据,电子商务

一、接口介绍 支持国内外1500快递物流公司的物流跟踪服务,包括顺丰、圆通、申通、中通、韵达等主流快递公司。同时,支持单号识别快递物流公司、按次与按单计费、物流轨迹返回等功能,以满足企业对快递物流查询多维度的需求。 二、使用案例截…

OJ练习第164题——具有所有最深节点的最小子树

具有所有最深节点的最小子树 力扣链接:865. 具有所有最深节点的最小子树 力扣链接:1123. 最深叶节点的最近公共祖先 题目描述 给定一个根为 root 的二叉树,每个节点的深度是 该节点到根的最短距离 。 返回包含原始树中所有 最深节点 的…

【网络安全】图解 Kerberos:身份认证

图解 Kerberos:身份认证 1.什么是 Kerberos ?2.Kerberos 基本概念2.1 基本概念2.2 KDC 3.Kerberos 原理3.1 客户端与 Authentication Service3.2 客户端与 Ticket Granting Service3.3 客户端与 HTTP Service Kerberos 是一种身份认证协议,被…

【进阶篇】MySQL的MVCC实现机制详解

文章目录 0.前言1.基础介绍1.1. 什么是MVCC?1.1. 什么是当前读和快照读?1.1. 当前读,快照读和MVCC的关系1.1. MVCC能解决什么问题,好处是?1.1.1. 提高并发性能1.1.2. 避免死锁1.1.3. 解决脏读、不可重复读和幻读等问题1.1.4. 实现…

Python实现SSA智能麻雀搜索算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法,在2020年提出&a…

CATIA Composer软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 CATIA(Computer-Aided Three-dimensional Interactive Application)是一款由法国达索系统公司开发的三维计算机辅助设计(CAD)软件。它是一种全面的产品开发解决方案,广泛…

linux安装wget命令_linux下载文件到本地命令

1、检查是否有安装wget rpm -qa|grep "wget" 复制 在这里插入图片描述 若存在则移除,以下为移除命令 # 移除wget yum remove wget 复制 2、登录wget官网下载地址,下载最新的wget的rpm安装包到本地 下载地址:http://mirrors.…

Android Jetpack Compose 用计时器demo理解Compose UI 更新的关键-------状态管理(State)

目录 概述1.什么是状态2.什么是单向数据流3.理解Stateless和Stateful4.使用Compose实现一个计数器4.1 实现计数器4.2 增加组件复用性-----状态上提 总结 概述 我们都知道了Compose使用了声明式的开发范式,在这样的范式中,UI的职责更加的单一&#xff0c…

行业追踪,2023-09-06

自动复盘 2023-09-06 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

Informatica使用工作流程及案例1

操作流程 ①定义源 ②定义目标 ③创建映射 ④定义任务 ⑤创建工作流 ⑥工作流调度监控 ⑦查验数据 连接D,并定义源、连接源 D:定义目标 通过源定义目标 D:定义好的目标表的表结构生成到目标数据库EDW层 D:创建映射 W:定义任务 W:执行工作流…

第3章 【MySQL】字符集和比较规则

3.1 字符集和比较规则简介 3.1.1 字符集简介 如何存储字符串?需要建立字符与二进制数据的映射关系。建立这个关系需要: 1.把哪些字符映射成二进制数据? 2.怎么映射? 将一个字符映射成一个二进制数据的过程也叫做 编码 &#…

【CI/CD】Rancher CD过程--20230906

gitlab设定CICD的变量 HARBOR_PASSWORD:密码HARBOR_USER:工号K8S_TOKEN:Bearer rancher key K8S_WORKLOAD_URL:选择【View in API】的URL,并非workload的URL。 准备json.txt 选择workload,进入【View i…

用户案例 | 蜀海供应链基于 Apache DolphinScheduler 的数据表血缘探索与跨大版本升级经验

导读 蜀海供应链是集销售、研发、采购、生产、品保、仓储、运输、信息、金融为一体的餐饮供应链服务企业。2021年初,蜀海信息技术中心大数据技术研发团队开始测试用DolphinScheduler作为数据中台和各业务产品项目的任务调度系统工具。本文主要分享了蜀海供应链在海…

Linux——(第五章)用户管理

目录 一、概述 二、基本操作 1.添加用户 2.指定/修改密码 3.删除用户 4.查询用户信息 5.切换用户 6.查看创建了那些用户 7.查看登录用户信息 8.设置普通用户具有root权限 9.用户组 10.修改组 11.用户和组的相关文件 一、概述 Linux系统是一个多用户多任务的操作系…

Ubuntu下QT操作Mysql数据库

本篇总结一下一下Ubuntu下QT操作Mysql数据库。 目录 1. 启动Mysql数据库服务器 2.查看QT支持的数据库驱动 3.连接数据库 4. 增加表和记录 5. 删除记录 6. 修改记录 7. 查询记录 8.完整代码和运行效果 常见错误总结: (1) 数据库服务没启动报错信息 (2) 有…

Java实现WebSocket客户端和服务端(简单版)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

自动驾驶(apollo)

💓博主csdn个人主页:小小unicorn 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 自动驾驶技术 引言自动驾驶的基本原理自动驾驶的技术挑战自动驾驶的潜在影响结…

[BSidesCF 2019]Futurella 1

外星语? 看到这个,我第一时间就是想复制百度一下看是不是什么新编码 结果… 你会发现你粘贴的时候出现的是英文,里面还带着flag 破案 查看源代码 发现根本就没有什么外星语,可能就是style.css在作祟 完整复制内容 Resistanc…

蓝牙协议栈BLE

前言 这阵子用到蓝牙比较多,想写一个专栏专门讲解蓝牙协议及其应用,本篇是第一篇文章,讲解低功耗蓝牙和蓝牙协议栈。 参考网上各大神文章,及瑞萨的文章,参考GPT,并且加入了一些本人的理解。 图片部分源自…

国内的几款强大的智能—AI语言模型

1、Tomchat :Tomchat https://www.tomchat.uk 支持gp4 支持 midjourny绘画 AI绘画功能:点我 介绍 1、4聊天 2、AI绘画 3、头像制作 1、国内百度研发的,文心一言: https://yiyan.baidu.com/welcome 大家如果像我的界面一样有【…