—————第二天——————你是什么意思?让我们以下面的链表为例:给定链表的头节点,但不知道链表的实际长度,我们需要从链表的底部找到第n个节点。
。
假设n = 3,则要找到的节点是元素1:如何使用队列?小慧的想法如下:1.创建一个长度为n的队列,遍历原始链表,然后让节点一个接一个地进入队列:2.当队列已满时,将tail元素移出,然后新节点进入队列:3.遍历链接列表中的所有节点时,队列末尾的元素是从底部开始的第n个节点(因为队列长度为n): ———————————首先,我们创建两个指针P1和P2,P1指向链接列表的头节点,P2指向链接列表的第n个正节点(即第三个示例中的节点):接下来,我们让指针P1和P2同时向右旋转,每次向右旋转一步,直到指针P2移至链接列表的末尾:此时,由于P2指向链接列表的末端节点,P1和P2之间的距离为n-1,P1指向的节点是我们要查找的N个节点的链接列表的最后一点:显然,此方法只需要从头到尾遍历链表一次,并且只使用两个指针。
该算法的空间复杂度为O(1)。
公共类NthFromEnd {公共静态节点findNthFromEnd(Node head,int n){Node p1 = head;节点p2 =头; p2指向i的第n个正节点的指针; int我p2.next; if(p2 == null)抛出新的IllegalArgumentException(“参数n超过列表的长度!”); (p2)指向链的末端,p2,p2,p2,p2和p2 = Null){p1 = p1.next; p1 = p1.next; p2 = p2.next; p2.next;返回(p1)节点数组{0}}}}}}}}< / / /快速创建链接列表Node。
p =头; for(int i = 1; i = 1; i p.next =新Node(array [i]); p.next; p.next;节点/静态节点节点列表;返回;; Node(int数据){this .data =数据; public static void main(String [] args){1,2} {5,3,7,9} head = buildLinkList(inputs);节点node = findNthFr omEnd(head,3); System.out .println(“链表底部的第三个元素是:” + node.data);}} ————— END —————喜欢这篇文章的朋友们,欢迎关注公众。
程序员小慧,观看更多精彩内容,然后单击[查找],这是对小慧的最大支持!免责声明:本文内容经21ic授权后发布,版权归原作者所有,该平台仅提供信息存储服务。
本文仅代表作者个人观点,不代表本平台的立场,如有任何疑问,请与我们联系,谢谢!