思路:
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);
        }
    }
}