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(); } } }