思路:
1、构建链表的时候可以记录一个尾结点,这样插入的时候不用从头遍历一次找到尾巴;
2、查找倒数第 k 个结点的时候,使用快慢指针的技巧,让快指针先走 k-1 步,后面快慢指针同步走,快指针到尾结点后,慢指针指向的就是结果了;
(如果链表总长小于 k ,就会出现异常,题目说异常返回空指针,但是这是个无返回的函数,就当没有这回事吧)
3、按照测试结果,倒数第 0 个结点的值恒为0,可以先判断 k 是否为 0 ,如果是就直接输出了。
代码:
import java.util.*;
public class Main {
// 链表结点类
static class ListNode {
int m_nKey;
ListNode m_nNext;
public ListNode(int m_nKey, ListNode m_nNext) {
this.m_nKey = m_nKey;
this.m_nNext = m_nNext;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 一次循环处理一组输入
while (in.hasNextInt()) {
int n = in.nextInt();
ListNode head = new ListNode(in.nextInt(), null);
ListNode tail = head;
// 构建链表
for (int i=1; i < n; i++) {
ListNode t = new ListNode(in.nextInt(), null);
tail.m_nNext = t;
tail = t;
}
int k = in.nextInt();
if (k == 0) {
System.out.println(0);
continue;
}
// 快指针先走 k-1 步
tail = head;
for (int i=1; i < k; i++) {
if (tail == null) break;
tail = tail.m_nNext;
}
// 快慢指针一起走剩下的路
while (tail.m_nNext != null) {
head = head.m_nNext;
tail = tail.m_nNext;
}
System.out.println(head.m_nKey);
}
}
}

京公网安备 11010502036488号