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