漫画:如何找到链表的倒数第n个结点?

—————  第二天  —————

什么意思呢?我们以下面这个链表为例:

给定链表的头结点,但并不知道链表的实际长度,要求我们找到链表的倒数第n个结点。

假设n=3,那么要寻找的结点就是元素1:

如何利用队列呢?小灰的思路如下:

1.创建一个长度为n的队列,遍历原始链表,让结点逐一进入队列:

2.当队列已满时,让队尾元素出队,新结点入队:

3.当链表全部结点遍历完毕时,队尾的元素就是倒数第n个结点(因为队列长度是n):

————————————

首先,我们创建两个指针P1和P2,P1指向链表的头结点,P2指向链表的正数第n个结点(也就是例子中的第3个结点):

接下来,我们让指针P1和P2同时循环右移,每次右移一步,直到指针P2移动到链表的末尾:

此时,由于P2指向链表的尾结点,且P1和P2的距离是n-1,因此P1所指的结点就是我们要寻找的链表倒数第n个结点:

显然,这个方法从头到尾只需要对链表做一次遍历,而且仅仅使用了两个指针,算法的空间复杂度是O(1)。

public class NthFromEnd {public static Node findNthFromEnd(Node head, int n){Node p1 = head;Node p2 = head;//把p2指针移动到正数第n个结点for(int i=1; i<n; i++){p2 = p2.next;if(p2 == null){throw new IllegalArgumentException("参数n超出链表长度!");}}//p1和p2一起右移,直到p2指向链表尾结点while (p2.next != null){p1 = p1.next;p2 = p2.next;}return p1;}//快速创建链表private static Node buildLinkList(int[] array){Node head = new Node(array[0]);Node p = head;for(int i=1; i<array.length; i++){p.next = new Node(array[i]);p = p.next;}return head;}//链表节点private static class Node {int data;Node next;Node(int data) {this.data = data;}}public static void main(String[] args) {int[] inputs = {5,3,7,2,4,1,9,8};Node head = buildLinkList(inputs);Node node = findNthFromEnd(head,3);System.out.println("链表倒数第3个元素是:" + node.data);}}



往期推荐

一文详解「队列」,手撸队列的3种方法!


算法图解:如何判断括号是否有效?


算法图解:如何找出栈中的最小值?


关注我,每天陪你进步一点点!

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

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

相关文章

转:开源图形库 c语言-图形图像库 集合

Google三维API O3DO3D 是一个开源的 Web API 用来在浏览器上创建界面丰富的交互式的 3D 应用程序。这是一种基于网页的可控3D标准。此格式期望真正的基于浏览器&#xff0c;独立于操作系统之外&#xff0c;并且支持主流的3D显卡&#xff0c;这样就可以在网页中实现效果逼真的3D…

cacti添加I/O监控

首先下载snmpdiskio-0.9.6.zip,文件不好找&#xff0c;我已经放在本文章的附件里面。解压snmpdiskio-0.9.6.zip复制partition.xml到cacti/resource/snmp_queries/下面[roottest]# cp partition.xml /home/wwwroot/default/cacti/resource/snmp_queries/分别导入模板文件&#x…

数组中的reverse_数组reverse()方法以及JavaScript中的示例

数组中的reverseJavaScript reverse()方法 (JavaScript reverse() method) reverse() method is used to reverse the order of the elements in an array, it changes the actual array and also returns an array with reversed elements. reverse()方法用于反转数组中元素的…

磊哥私藏书单分享,160买400的书!

程序员的节日&#xff08;10.24&#xff09;到了&#xff0c;当当的活动也搞起来了&#xff0c;作为有上进心的你&#xff0c;怎么可能停止学习和进步呢&#xff1f;所以磊哥在当当满 400 元减 200 元的基础上&#xff0c;有要了一个减 40 的劵&#xff0c;也就是只需要花 160 …

ORACLE中使用递归查询

在数据库查询中常常会碰到要查询树形结构的数据&#xff0c;需要用一个字段的数据当做下一条记录的父节点继续查询&#xff0c;如果在不知道有多少级节点的情况下一次次手写SQL查询会很繁琐而没有效率&#xff0c;这时可以使用 oracle中的connect with prior递归算法&#xff1…

linux——回射服务器

回射服务器即客户端发送一段数据给服务器&#xff0c;服务器再将这段数据原封不动的发送给客户端&#xff0c;原理很简单&#xff0c;原理图如下&#xff1a; 以TCP协议为例&#xff0c;客户端、服务器代码如下&#xff1a; ** 服务器&#xff1a; ** #include <stdio.h…

Android 5.0 API 的变化——开发人员注意

Android 5.0 API变化译自 http://developer.android.com/intl/zh-cn/about/versions/android-5.0.html —— By NashLegendSample示例在这里找&#xff1a;https://github.com/googlesamples/原译文在我的github上&#xff1a;https://github.com/NashLegend/ProjectBabel/blob…

dbms标识符无效_DBMS中的聚合运算符(分组依据和具有子句)

dbms标识符无效综合运营商 (Aggregate Operators) To calculate aggregate values, one requires some aggregate operators to perform this task. These operators run over the columns of a relation. The total number of five aggregate operators is supported by SQL a…

Java中的5大队列,你知道几个?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录至 https://github.com/vipstone/algorithm 《算法图解》系列。通过前面文章的学习《一文详解「队列」&#xff0…

mysql中int、bigint、smallint 和 tinyint的区别与长度

各种整形&#xff0c;总结留作参考。bigint从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据&#xff08;所有数字&#xff09;。存储大小为 8 个字节。int从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据&#xff08;所有数字…

linux——回射服务器多并发(多进程)

多并发原理如图&#xff0c;多个客户端连接一个服务器&#xff0c;无论哪个客户端发送数据给服务器&#xff0c;服务器都能把数据准确的返回给这个客户端。 在socket编程中&#xff0c;socket这种文件描述符被默认设置为阻塞&#xff0c;故而read函数和accept函数时阻塞函数&a…

算法图解:如何用两个栈实现一个队列?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录至 https://github.com/vipstone/algorithm 《算法图解》系列。队列和栈是计算机中两个非常重要的数据结构&#…

notepad++ 偶数行_C ++程序查找前N个偶数的立方和

notepad 偶数行The problem is we have a number N and we have to find sum of first N Even natural numbers. 问题是我们有一个数N &#xff0c;我们必须找到前N个偶数自然数之和。 Example: 例&#xff1a; Input:n 3Output:288 (2^3 4^36^3)A simple solution is give…

Auto activation triggers for Java(代码提示)功能扩展

1.打开Eclipse 后“window”→“Preferences”&#xff0c;选择“java”&#xff0c;展开&#xff0c;“Editor”&#xff0c;选择“Content Assist”。2.选择“Content Assist”&#xff0c;然后看到右边&#xff0c;右边的“Auto-Activation”下面的“Auto Activation trigge…

Linux——回射服务器多并发(多线程)

多线程与多进程的做法区别不大&#xff0c;思路一样&#xff0c;都是执行两个死循环&#xff0c;一个循环等待客户端连接&#xff0c;一个循环与客户端通信。多进程的方式请点此处 服务器 #include <sys/socket.h> #include <pthread.h> #include <unistd.h&g…

AIGC中的视觉生成文献整理

文章目录 文件夹文献总览图像生成技术视频生成技术Video Generation with Text ConditionVideo Generation with other ConditionsVideo Editing 生成模型在其他任务上的应用扩散模型在数据标记上的应用可控的图像生成技术 文件夹文献总览 AIGC 视觉生成文献整理├── 图像生…

「递归算法」看这一篇就够了|多图

前言递归是一种非常重要的算法思想&#xff0c;无论你是前端开发&#xff0c;还是后端开发&#xff0c;都需要掌握它。在日常工作中&#xff0c;统计文件夹大小&#xff0c;解析xml文件等等&#xff0c;都需要用到递归算法。它太基础太重要了&#xff0c;这也是为什么面试的时候…

数组tostring方法_数组toString()方法以及JavaScript中的示例

数组tostring方法JavaScript toString()方法 (JavaScript toString() method) toString() method is used to convert an array to the string. It is called with the array name and returns the string containing array elements with comma separated. toString()方法用于…

JAVA解析JSON数据

在网页中想后台传递多个数据时&#xff0c;有时数据还是多个动态列表&#xff0c;数据很复杂时&#xff0c;JavaScript程序员喜欢把他们作为json串进行处理&#xff0c;后台收到后需要对json字符串进行解析&#xff0c;幸好有JSON-lib&#xff0c;这个Java类包用于把bean,map和…

为什么把端口号改为80之后,访问的时候就可以不写端口号

一个关于tomcat的问题为什么把端口号改为80之后&#xff0c;访问的时候就可以不写端口号因为80端口是许多web服务器的默认端口&#xff0c;比如iis和apache&#xff0c;所有为了方便,浏览器在不知道请求端口的情况下默认会访问服务器的80端口百度知道这样的话就可以恶作剧了打开…