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

简介: 我们以下面这个链表为例:给定链表的头结点,但并不知道链表的实际长度,要求我们找到链表的倒数第n个结点。假设n=3,那么要寻找的结点就是元素1:

640.png640.png640.png

 

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

640.png

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

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

640.png

640.png640.png640.png640.png640.png640.png

如何利用队列呢?


小灰的思路如下:

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

 640.png

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

 

640.png

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

640.png640.png640.png640.png

 

 

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

640.png640.png640.png640.png640.png640.png

 

 

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

640.png

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

640.png640.png


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

640.png


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

640.png640.png

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);
    }
}

640.png640.png640.png640.png640.png640.png

相关文章
|
3月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
80 1
|
2月前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
25 1
|
4月前
链表的中间结点
链表的中间结点
183 57
|
3月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
47 0
Leetcode第十九题(删除链表的倒数第N个节点)
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
|
3月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
56 0
|
3月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
19 0
|
5月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
59 5
|
6月前
【数据结构OJ题】链表中倒数第k个结点
牛客题目——链表中倒数第k个结点
41 1
【数据结构OJ题】链表中倒数第k个结点

热门文章

最新文章