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