当前位置: 首页 > ops >正文

删除链表的倒数第N个结点--LeetCode

题目

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

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

示例 2:

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

示例 3:

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

思路一:计算链表长度

我们首先从头节点开始对链表进行一次遍历,得到链表的长度 L。随后我们再从头节点开始对链表进行一次遍历,当遍历到第 L−n+1 个节点时,它就是我们需要删除的节点。

为了与题目中的 n 保持一致,节点的编号从 1 开始,头节点为编号 1 的节点。

为了方便删除操作,我们可以从哑节点开始遍历 L−n+1 个节点。当遍历到第 L−n+1 个节点时,它的下一个节点就是我们需要删除的节点,这样我们只需要修改一次指针,就能完成删除操作。

/*** 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 removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0,head);//创建虚拟节点,直接将其放在头结点前int length = getLength(head);//调用getLength算法来对链表进行计算链表长度ListNode cur = dummy;//定义当前指针for(int i = 1;i < length - n + 1;i++){//下标从1开始,结束在下标倒数n之前一位cur = cur.next;}cur.next = cur.next.next;//直接删除return dummy.next;//返回虚拟节点下一个}public int getLength(ListNode head){//计算链表长度算法int length = 0;while(head != null){//结束条件为当前节点为空++length;head = head.next;}return length;}
}

思路二:栈

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

/*** 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 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++){//删除倒数第N个结点,i=0到n-1stack.pop();//弹出栈的顶部}ListNode prev = stack.peek();//倒数第N个结点的前一个结点prev.next = prev.next.next;//直接删除return dummy.next;}
}

http://www.xdnf.cn/news/8689.html

相关文章:

  • MySQL的存储引擎
  • 什么是 Spring MVC 的异步请求处理?
  • 如何在uniapp H5中实现路由守卫
  • JVM规范之栈帧
  • 15.1 【基础项目】使用 HTML、CSS 和 TypeScript 构建的简单计数器应用
  • LLM之Agent:Mem0的简介、安装和使用方法、案例应用之详细攻略
  • C# Windows Forms应用程序-002
  • # 使用 Hugging Face Transformers 和 PyTorch 实现信息抽取
  • 数据结构第2章 (竟成)
  • 神经网络加上注意力机制,精度反而下降,为什么会这样呢?注意力机制的本质是什么?如何正确使用注意力机制?注意力机制 | 深度学习
  • 清山垃圾的3个问题
  • 6.4.1最小生成树
  • 第二章网络io
  • 对WireShark 中的EtherCAT抓包数据进行解析
  • C语言指针进阶:通过地址,直接修改变量的值
  • iOS App启动优化(冷启动、热启动)
  • 2025年渗透测试面试题总结-匿名[实习]安全工程师(安全厂商)(题目+回答)
  • 【HTML-12】HTML表格常用属性详解:从基础到高级应用
  • 显存不够?节约显存高效微调语言模型的五种方法及实验
  • 0基础 Git 代码操作
  • 黑马k8s(十六)
  • 题目 3325: 蓝桥杯2025年第十六届省赛真题-2025 图形
  • whisper相关的开源项目 (asr)
  • 动态规划-蓝桥杯-健身
  • Apache OFBiz 17.12.01 的远程命令执行漏洞 -Java 反序列化 + XML-RPC 请求机制
  • MCP技术体系介绍
  • ETL工具:Kettle,DataX,Flume,(Kafka)对比辨析
  • Java高频面试之并发编程-20
  • 03. C#入门系列【变量和常量】编程世界里的“百变魔盒”与“永恒石碑”
  • XSS脚本攻击-DDoS僵王博士-SQL注入-考试周前的邮件