package cn.dzp.flyroc.offer; public class FindKthToTailDemo { /*题目描述:输入一个链表,输出该链表中倒数第k个节点*/ /*思路:定义一快一慢两个指针,快指针走K步,而后慢指针开始走, 快指针到尾时,慢指针就找到了倒数第K个节点*/ /*首先判断直接不能够的状况,head为空不能够,k小于等于0不能够 而后定义两个指针的位置,两个指针相对距离为k 先将第一个日后移动k个指针,而后两个一直日后移动,一直到末尾 而后就能够获得倒数第k个节点*/ //代码实现 public static class ListNode{ int data; ListNode nextNode = null; //定义构造方法 ListNode(int data){ this.data = data; } } public static ListNode findKthToTail(ListNode head, int k){ int m = k; //定义m的值,用于输出 if (head == null || k <= 0){ //判断头节点是否为空,k是否小于等于0 return null; } ListNode fast = head; //定义快指针节点 ListNode slow = head; //定义慢指针节点 for (int i=1; i < k; i++){ //将快指针节点向后移动k-1个距离 if (fast.nextNode != null){ fast = fast.nextNode; }else { return null; } } //快慢指针一块儿移动 while (fast.nextNode != null){ fast = fast.nextNode; slow = slow.nextNode; } System.out.println("这是第倒数第"+m+"个节点:"+slow.data); return slow; } public static void main(String[] args){ ListNode l1 = new ListNode(1); ListNode l2 = new ListNode(2); ListNode l3 = new ListNode(3); ListNode l4 = new ListNode(4); ListNode l5 = new ListNode(5); l1.nextNode = l2; l2.nextNode = l3; l3.nextNode = l4; l4.nextNode = l5; l5.nextNode = null; try { findKthToTail(l1, 2); throw new ArrayIndexOutOfBoundsException("数组索引越界"); } catch (ArrayIndexOutOfBoundsException e){ e.getLocalizedMessage(); } } }