题解 | #输出单向链表中倒数第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);
}
}
}

查看2道真题和解析