中国水土保持生态建设网站,关于网站建设的通知,张家港网站制作,三亚用什么软件约————— 第二天 —————什么意思呢#xff1f;我们以下面这个链表为例#xff1a;给定链表的头结点#xff0c;但并不知道链表的实际长度#xff0c;要求我们找到链表的倒数第n个结点。假设n3#xff0c;那么要寻找的结点就是元素1#xff1a;如何利用队列呢我们以下面这个链表为例给定链表的头结点但并不知道链表的实际长度要求我们找到链表的倒数第n个结点。假设n3那么要寻找的结点就是元素1如何利用队列呢小灰的思路如下1.创建一个长度为n的队列遍历原始链表让结点逐一进入队列2.当队列已满时让队尾元素出队新结点入队3.当链表全部结点遍历完毕时队尾的元素就是倒数第n个结点因为队列长度是n————————————首先我们创建两个指针P1和P2P1指向链表的头结点P2指向链表的正数第n个结点也就是例子中的第3个结点接下来我们让指针P1和P2同时循环右移每次右移一步直到指针P2移动到链表的末尾此时由于P2指向链表的尾结点且P1和P2的距离是n-1因此P1所指的结点就是我们要寻找的链表倒数第n个结点显然这个方法从头到尾只需要对链表做一次遍历而且仅仅使用了两个指针算法的空间复杂度是O1。public class NthFromEnd {public static Node findNthFromEnd(Node head, int n){Node p1 head;Node p2 head;//把p2指针移动到正数第n个结点for(int i1; in; 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 i1; iarray.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种方法算法图解如何判断括号是否有效算法图解如何找出栈中的最小值关注我每天陪你进步一点点