Leecode刷题之路第19天之删除链表的倒数第N个结点

server/2024/10/18 9:30:03/

题目出处

19-删除链表的倒数第N个结点-题目出处

题目描述

在这里插入图片描述

个人解法

思路:

todo

代码示例:(Java)

todo

复杂度分析

todo

官方解法

19-删除链表的倒数第N个结点-官方解法

前言

在这里插入图片描述

方法1:计算链表长度

思路:

在这里插入图片描述

代码示例:(Java)

public class Solution1 {@Datapublic static class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}ListNode(int val, ListNode next) {this.val = val;this.next = next;}}public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0, head);int length = getLength(head);ListNode cur = dummy;for (int i = 1; i < length - n + 1; ++i) {cur = cur.next;}cur.next = cur.next.next;ListNode ans = dummy.next;return ans;}public int getLength(ListNode head) {int length = 0;while (head != null) {++length;head = head.next;}return length;}}

复杂度分析

  • 时间复杂度:O(L),其中 L 是链表的长度。
  • 空间复杂度:O(1)。

方法2:栈

思路:

我们也可以在遍历链表的同时将所有节点依次入栈。根据栈「先进后出」的原则,我们弹出栈的第 n 个节点就是需要删除的节点,并且目前栈顶的节点就是待删除节点的前驱节点。这样一来,删除操作就变得十分方便了。

在这里插入图片描述

代码示例:(Java)

public class Solution2 {@Datapublic static class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}ListNode(int val, ListNode next) {this.val = val;this.next = next;}}public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0, head);Deque<ListNode> stack = new LinkedList<ListNode>();ListNode cur = dummy;while (cur != null) {stack.push(cur);cur = cur.next;}for (int i = 0; i < n; ++i) {stack.pop();}ListNode prev = stack.peek();prev.next = prev.next.next;ListNode ans = dummy.next;return ans;}}

复杂度分析

  • 时间复杂度:O(L),其中 L 是链表的长度。
  • 空间复杂度:O(L),其中 L 是链表的长度。主要为栈的开销。

方法3:双指针

思路:

在这里插入图片描述
在这里插入图片描述

代码示例:(Java)

public class Solution3 {@Datapublic static class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}ListNode(int val, ListNode next) {this.val = val;this.next = next;}}public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0, head);ListNode first = head;ListNode second = dummy;for (int i = 0; i < n; ++i) {first = first.next;}while (first != null) {first = first.next;second = second.next;}second.next = second.next.next;ListNode ans = dummy.next;return ans;}}

复杂度分析

  • 时间复杂度:O(L),其中 L 是链表的长度。
  • 空间复杂度:O(1)。

考察知识点

1.链表

关键术语: 结点 、头结点 、尾结点

在这里插入图片描述

2.内部类
在这里插入图片描述

3.@Data注解

4.Deque

收获

1.多张图片转为gif动图

实战链接 完全免费

Gitee源码位置

19-删除链表的倒数第N个结点-源代码

同名文章,已同步发表于CSDN,个人网站,公众号

  • CSDN

    工一木子
  • 个人网站

    工藤新一
  • 公众号

    在这里插入图片描述

http://www.ppmy.cn/server/131704.html

相关文章

bat脚本banenr

飞出个未来班得 echo off echo .-. echo ( ) echo - echo J L echo ^| ^| echo J L echo ^| ^| echo J L echo …

【Golang】关于Go语言中的IO操作

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Spring Cache与Redis实现自动缓存处理:入门指南

Spring Cache与Redis实现自动缓存处理:入门指南 在现代Web应用程序开发中,缓存是提升性能的关键技术之一。本文将介绍如何在Spring Boot应用程序中使用Spring Cache和Redis实现自动缓存处理,帮助你快速入门这项强大的技术组合。 为什么选择Spring Cache和Redis? Spring Cac…

#pragma DATA_ALIGN地址对齐指令

背景描述: 在学习#pragma DATA_ALIGN时看到有句描述"地址的低几位一定为0"&#xff0c;当时有点没明白是什么意思&#xff0c;后面才反应过来&#xff0c;这里记录下。 相关博客 个人理解: 以8字节对齐为例&#xff0c;地址是8的倍数&#xff0c;转换成二进制来看&a…

R语言绘制气泡图

气泡图是一种数据可视化图表。它通常在二维或三维空间中展示数据。两个变量决定气泡在平面或空间中的位置&#xff0c;第三个变量则以气泡大小呈现。能直观反映三个变量间关系&#xff0c;帮助用户快速理解数据特征和趋势&#xff0c;在数据分析和展示中广泛应用。 0x01 使用s…

深度学习:循环神经网络——LSTM

目录 前言 一、LSTM主要组成部分 二、LSTM的工作原理 三、LSTM的工作步骤详解 1.遗忘门 2.输入门 3.输出门 前言 LSTM&#xff08;长短期记忆网络&#xff09;是一种特殊类型的循环神经网络&#xff08;RNN&#xff09;&#xff0c;用于处理和预测序列数据。与传统的RNN…

MT1331-MT1340 码题集 (c 语言详解)

MT1331用函数求π的近似值 c 语言代码实现 #include <math.h> #include <stdio.h> double Fun() {double pi_over_4 0.0; // Π / 4 的近似值double current; // 当前项int i 0; // 项的索引do {current (i % 2 0 ? 1.0 : -1.0) / (2.0…

Elasticsearch 8 的详细安装步骤和基本使用

一、Elasticsearch 简介 Elasticsearch 8 简称 es8 是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;网上对其有非常详细的定义这里不多做赘述&#xff0c;总之它是在你查询语句性能达到瓶颈&#xff0c;并且使用了索引、缓存等手段仍然无法突破的情…