【算法题】找到链表倒数第N个结点

题目描述:找到链表倒数第N个结点,但是链表长度不懂
  • 法一:借助一个长度为N的队列

    1. 创建一个长度为N的队列,遍历原始链表,让结点依次入队
    2. 当队满时,让队尾元素出队,新结点入队
    3. 当链表全部遍历完时,队尾元素就是倒数第N个结点。因为队列长度为N
  • 法二:双指针

    1. 创建两个指针P1和P2,P1指向链表的头结点,P2指向链表的正数第N个结点
    2. 让P1和P2同时循环右移,每次移动一步,直到P2移动到链表末尾
    3. P1指向的元素就是倒数第N个元素。因为P1到P2 的距离为N。
    4. 代码如下:
    
    class NthFromEnd {
        // 链表结点
        private static class Node {
            int data;
            Node next;
    
            Node(int data) {
                this.data = data;
            }
        }
    
        // 创建链表
        public 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;
        }
    
        //  找到链表倒数第N个结点
        public static int findNthFromEnd(Node head, int n) {
            // 创建两个指针p1和p2
            Node p1 = head;//p1指向第一个结点
            Node p2 = head;
            // 把p2指向正数第N个结点,i从1开始
            for (int i = 1; i < n; i++) {
                p2 = p2.next;
                if (p2 == null)
                    throw new IllegalArgumentException("参数n超出链表长度");
            }
            // p1 和 p2 一起往前一步
            while (p2.next != null) {
                p1 = p1.next;
                p2 = p2.next;
            }
            return p1.data;
        }
    
        // main
        public static void main(String[] args) {
            int[] inputs = {5, 3, 7, 2, 4, 1, 9, 8};// 模拟输入的链表
            int endIndex = 3;//查找倒数第三个
            Node head = buildLinkList(inputs);
            int data = findNthFromEnd(head, endIndex);
            System.out.println("链表倒数第" + endIndex + "个元素是:" + data);
        }
    
    }
    
    
    1. 扩展:如果要查找一个数组中的倒数第N个元素,如何才能快速找到。那直接就返回下标 [length-n] 就行了

文章参考公众号:程序员小灰。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值