原文地址:http://blog.csdn.net/nokiaguy/archive/2009/01/17/3818966.aspx public class Test { static class Node { public int data; public Node nextNode; } // // 核心算法 private static int findNode(Node headNode, int k) { Node p = headNode, p1 = headNode, p2 = null; int count = 0; // 表示结点数 while (p.nextNode != null) { p = p.nextNode; count++; // 遇到k的整数位个结点,进行分块 if (count % k == 0) { if (p2 != null) p1 = p2; p2 = p; } } // k超过链表结点数,未找到,返回0 // 此处也可以用k > count来判断 if (p2 == null) { return 0; } else { int mod = count % k; int offset = mod + 1; // 任何情况下,最终结果都是p1指向的结点向后移动(mod + 1)个结点 for (int i = 0; i < offset; i++) p1 = p1.nextNode; System.out.println(p1.data); return 1; } } public static void main(String[] args) throws Exception { //产生一个包含1个头结点和120个结点的链表 Node headNode = new Node(); Node p = headNode; for (int i = 0; i < 120; i++) { p.nextNode = new Node(); p.nextNode.data = i + 1; p = p.nextNode; } p.nextNode = null; // 开始查找倒数第k个结点,如果找到,返回1,并输出结点的data值 System.out.println(findNode(headNode, 12)); } }