题目描述:找到链表倒数第N个结点,但是链表长度不懂
-
法一:借助一个长度为N的队列
- 创建一个长度为N的队列,遍历原始链表,让结点依次入队
- 当队满时,让队尾元素出队,新结点入队
- 当链表全部遍历完时,队尾元素就是倒数第N个结点。因为队列长度为N
-
法二:双指针
- 创建两个指针P1和P2,P1指向链表的头结点,P2指向链表的正数第N个结点
- 让P1和P2同时循环右移,每次移动一步,直到P2移动到链表末尾
- P1指向的元素就是倒数第N个元素。因为P1到P2 的距离为N。
- 代码如下:
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); } }
- 扩展:如果要查找一个数组中的倒数第N个元素,如何才能快速找到。那直接就返回下标 [length-n] 就行了
文章参考公众号:程序员小灰。