删除链表的倒数第N个节点,剑指offerII(21),力扣

目录

题目地址:

题目:

相似类型题:

我们直接看本题题解吧:

解题方法:

难度分析:

解题分析:

解题思路(双指针):

代码实现:

代码说明:

代码实现(计算链表长度):

代码实现(栈): 


题目地址:

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

难度:中等

今天刷删除链表的倒数第N个节点,大家有兴趣可以点上看看题目要求,试着做一下

题目:

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

相似类型题:

    强烈建议先做做这道题目,做完这道题,对下面题目的双指针解法会有更好的理解

链表中倒数第k个节点,剑指offer,力扣-CSDN博客

我们直接看本题题解吧:

解题方法:

方法1、计算链表长度(两次遍历,第一次求链表长度,第二次删除对应节点)

方法2、栈,(利用先进后出特点)

方法3、双指针(快慢指针)

难度分析:

总体上不是很难,主要是双指针的使用与理解

解题分析:

解题思路(双指针):

1、创建亚节点dummy(充当虚头结点),指向head

2、创建双指针,fast,slow,这里指针fast直接指向head,而指针slow需要指向被删除节点的上一个节点(不然被删节点后面节点也跟着被删了),因此需要初始化指向dummy节点

3、循环遍历,fast指针先走n步,然后fast与slow同步移动(此时二者相差n-1个节点),最后直到fast指向null,那么此时slow指向的是被删节点的前驱节点

4、最后返回链表,不过要注意是返回dummy.next即链表的第一个节点,如果返回head在特殊情况下会报错。

 

代码实现:

/*** 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; }* }*///这里first即fast,second即slowclass Solution {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;        //指针fast 先走n步}while (first != null) {first = first.next;second = second.next;     //fast 与slow同步移动,直至 fast指向null}//被删节点的上一节点的next指向被删节点的下一节点,即删除节点操作second.next = second.next.next;ListNode ans = dummy.next;return ans;//这里如果返回head的话,那么当链表只有一个元素并且删除一个元素的时候返回的不是空}
}
代码说明:

解题思路里讲的特殊情况,即链表只有一个元素时要删除这个元素,则会报错,所以保险起见,还是用设置头指针指向链表第一个结点的方式比较稳妥。

代码实现(计算链表长度):

class Solution {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;}
}

代码实现(栈): 

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) {stack.pop();}ListNode prev = stack.peek();prev.next = prev.next.next;ListNode ans = dummy.next;return ans;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯-01简介

文章目录 蓝桥杯简介参考资源蓝桥杯官网第15届大赛章程一、概况&#xff08;一&#xff09;大赛背景和宗旨&#xff08;二&#xff09;大赛特色&#xff08;三&#xff09;大赛项目1.Java软件开发2.C/C程序设计3.Python程序设计4.Web应用开发5.软件测试6.网络安全7.嵌入式设计与…

大型网站系统架构演化(Web)

大型网站系统架构演化 大型网站系统架构演化需要关注的维度涉及的技术演进过程单体架构垂直架构使用缓存改善网站性能缓存与数据库的数据一致性问题缓存技术对比Redis分布式存储方案Redis集群切片的常见方式Redis数据类型Redis 淘汰算法 大型网站系统架构演化 需要关注的维度 …

Docker智驾开发环境搭建

文章目录 背景1. 什么是容器?2. 什么是Docker?2.1 Docker架构3. 为什么要使用Docker?3.1 Docker容器虚拟化的好处3.2 Docker在开发和运维中的优势4. Docker容器与传统虚拟化的区别4.1 区别4.2 Docker的优势5. Docker的核心概念6. Docker在嵌入式开发中的应用7. docker实践参…

visual c++ 2019 redistributable package

直接安装下面包只有24M Microsoft Visual C Redistributable 2019 x86: https://aka.ms/vs/16/release/VC_redist.x86.exe x64: https://aka.ms/vs/16/release/VC_redist.x64.exe ———————————————— 版权声明&#xff1a;本文为CSDN博主「kpacnB_Z」的原创文章…

基于Python的网络爬虫设计与实现

基于Python的网络爬虫设计与实现 摘要&#xff1a;从互联网时代开始&#xff0c;网络搜索引擎就变得越发重要。大数据时代&#xff0c;一般的网络搜索引擎不能满足用户的具体需求&#xff0c;人们更加注重特定信息的搜索效率&#xff0c;网络爬虫技术应运而生。本设计先对指定…

从赛车到服务台:IT团队可以从F1赛车中学到什么?

一级方程式赛车被誉为最高级别的赛车&#xff0c;简称F1赛车&#xff0c;它不断挑战速度、创新和进步的极限。因此&#xff0c;对于您的IT团队来说&#xff0c;还有什么比这项运动更值得借鉴的呢&#xff1f; 作为赛车运动的巅峰之作&#xff0c;F1赛车拥有10支车队和20名车手…

Open Feign 源码解析(四) --- 请求对象构造(上)

Open Feign 源码解析四 请求对象的构造&#xff08;上&#xff09; 源码前三篇文章写了这个图的过程 源码前三篇文章的内容归纳起来就是讲了这样的问题&#xff1a; 如何把接口转换为具有发送http请求能力的feign client对象以及如何整合到Spring容器中&#xff1f; 如何构造…

C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)

分析&#xff1a; 在程序中&#xff0c;定义一个函数 fix&#xff0c;该函数使用指针变量来访问字符串中的每个字符&#xff0c;并计算出字符串的长度。fix 函数的参数为指向 char 类型的指针变量 p&#xff0c;表示需要计算长度的字符串。 在主函数 main 中&#xff0c;定义一…

消息队列MQ

文章目录 同步通讯和异步通讯什么是MQ?一.RabbitMQ概述二.SpringAMQP1.Work Queue 工作队列2.发布订阅-Fanout Exchange3.发布订阅-DirectExchange4.发布订阅-TopicExchange 3.消息转换器 同步通讯和异步通讯 其实在之前的JAVASE中就已经在线程一章中接触过了同步和异步的概念…

Lombok工具包的安装和使用

目录 一.常用的注解 二.引入依赖的两种方式 1.在maven仓库中引入 2.安装插件EditStarter 三.使用举例 四.原理 Lombok是一个java库&#xff0c;它可以自动插入到编辑器和构建工具中&#xff0c;增强java的性能。不需要再写getter、setter或equals方法&#xff0c;只要有一…

舞蹈店管理系统服务预约会员小程序效果如何

舞蹈的作用很广&#xff0c;也有大量求学者&#xff0c;每个城市也有大小各异的舞蹈品牌店&#xff0c;他们承接商演、也会教学员、宣传拓展生意等&#xff0c;因此近些年来&#xff0c;随着互联网深入及短视频&#xff0c;舞蹈业市场规模也在增加。 而在门店经营中&#xff0…

可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器

可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器 文章目录 可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 …