题解 | #输出单向链表中倒数第k个结点#
输出单向链表中倒数第k个结点
https://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d
示例需要对链表和双指针应用有了解,是对高赞示例的仿写,添加了必要的注释
import java.util.Scanner; /** * 示例是对 https://www.nowcoder.com/users/4479402 同学的仿写,加入了必要的注释 ~ 感谢提供思路 */ public class Main { public static class Node { int key; Node next; public Node(int key) { this.key = key; this.next = null; } } public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意用例里面有些用例是使用空格进行分隔的,需要用 hasNext,否则接收不到 while (in.hasNext()) { // 列表元素数量 int n = in.nextInt(); // 异常范围 if (n <= 0) { System.out.println(0); continue; } // 头指针 Node perv = new Node(in.nextInt()); // 索引指针,通过索引指针的移动给链表装入数据 Node index = perv; for (int i = 0; i < n - 1; i ++) { int e = in.nextInt(); index.next = new Node(e); index = index.next; } // 获取 k 位置 int k = in.nextInt(); // 异常范围 if (k <= 0 || k > n) { System.out.println(0); continue; } // 这里使用快慢指针操作 // 注意:fast指针先开始“从前往后”找第 k 个位置,注意是“从前往后”,而不是“从后往前” Node fast = perv; Node slow = perv; for (int i = 0; i < k; i++) { fast = fast.next; } // fast指针找到后,再让slow指针跟着fast指针一起向后移动 // 直到fast指针移动到末尾位置,slow对着的正好是从末尾到 k 的位置 while (fast != null) { fast = fast.next; slow = slow.next; } System.out.println(slow.key); } } }