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

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

给定链表的头结点,但并不知道链表的实际长度,要求我们找到链表的倒数第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种方法!

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

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

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

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

  1. 【算法】漫画:如何找到链表的倒数第n个结点?

    -----  第二天  ----- 什么意思呢?我们以下面这个链表为例: 给定链表的头结点,但并不知道链表的实际长度,要求我们找到链表的倒数第n个结点. 假设n=3,那么要寻找的结点就是元素1: 如何 ...

  2. 【Java】找到链表中倒数第k个结点

    题目描述 : 输入一个链表,输出该链表中倒数第k个结点. 解题思路 : 1.根据以上链表进行分析 2.算法思想 : 定义两个引用,即快慢指针,都从头节点开始向后走: 要找到倒数第k个节点,即要让快指针 ...

  3. python代码找到链表的倒数第K个节点并打印

    python代码找到链表的倒数第K个节点并打印 在计算机科学中,链表是数据元素的线性集合,其顺序不是由它们在内存中的物理位置决定的.相反,每个元素指向下一个元素.它是一种数据结构,由一组节点组成,这些 ...

  4. 面试经典:链表中倒数第k个结点?如何从大量数据中找出高频词?

    记录两道面试题: 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(单向链表) 拿到这个问题的时候自然而然会想到让链表从末尾开始next   K-1 次不就是第K-1个节点了么,但是必须要注意一 ...

  5. [剑指offer]面试题15:链表中倒数第k个结点

    面试题15:链表中倒数第k个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6个结点,从头结点开始 ...

  6. 算法:输入一个链表,输出该链表中倒数第k个结点。

    算法:输入一个链表,输出该链表中倒数第k个结点.<剑指offer> 思路加到注释里面了: 1:两个if判断是否返回值为空,首个为空,没有第k个值: 2:for循环找到倒数第k个值,返回为a ...

  7. C/C++面试题—链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 解题思路 顺数第1个结点和顺数第k个结点 倒数第k个结点和倒数第1个结点 神马关系?顺数第k个结点指针走到倒数第1个结点时候,顺数第1个结点指针刚 ...

  8. 查找链表中倒数第k个结点(C++)

    描述 利用单链表表示一个整数序列,请实现一个时间复杂度为O(n).空间复杂度为O(1)的算法,通过一趟遍历在单链表中确定倒数第k个结点. 输入 多组数据,每组数据有三行,第一行为链表的长度n,第二行为 ...

  9. 剑指offer面试题[15]-链表中倒数第K个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 假设链表有n个结点,那么倒数第k个结点就是从头结点开始的第n-k+1个结点,我们只要从头结点开始往后走n-k+1步就可以了.那么问题来了: ...

最新文章

  1. 古怪的ConfigurationManager类
  2. 平衡树性质与基本算法
  3. WordPress开发之WP Custom Register Login插件试用
  4. Tomcat - ClassFormatException的解决方法
  5. python代理爬取存入csv文件
  6. 当数据库遇见FPGA:X-DB异构计算如何实现百万级TPS?
  7. PHP通过文件存储来实现缓存
  8. Python测试程序用时时长(运行时间测试)
  9. docker mysql 远程连接_Docker MySQL的安装与远程连接
  10. Java import javax.servlet 出错
  11. 内存瓶颈和计算负载问题一举突破?韩松团队提出MUCNetV2:解锁MCU端新纪录!...
  12. TOMCAT JNDI RESOUCE
  13. php读取带分隔符的txt文件,Pandas中文手册
  14. python+selenium,打开浏览器时报selenium.common.exceptions.WebDriverException: Message: 'chromedriver' execut
  15. Debian10配置IP地址、DNS、主机名
  16. 快速批量删除新浪微博内容
  17. xson 1.0.2 发布,新增byte[] buffer,支持XCO
  18. 图片按日期批量导入WPS表格
  19. 速卖通正式推出全托管,卖家竞争进入新阶段
  20. C++_数字时钟软件实现设计

热门文章

  1. 日常问题——flume连接hive时报错Caused by: java.lang.NoSuchMethodError
  2. ubuntu下wps不能输入中文
  3. Kewail-邮件短信接口的基础教程
  4. 127.0.0.1与localhost的区别
  5. JavaSE基础知识学习-----泛型
  6. hadoop-eclipse-plugin使用
  7. 利用Visio 2007图形化项目进度和项目跟踪
  8. 多媒体融合通信平台促进公网和专网的互联互通
  9. 分布式 dynamips+dyangen (更新于07.3.30)
  10. 2021吉林高考26日几点可以查询成绩,2021吉林高考成绩查分时间及入口