public class Q15 {
/**
* 题目:链表中倒数第K个结点
* 题目说明:输入一个链表,输出链表中倒数第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如:一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点。
* 解题思路:为提高程序的健壮性,需要对特殊的条件进行判断。首先找到k的位置,通过两个下标只差相差k-1个,来控制要查找的结点,当到达最后一个结点时,前一个下标正好到达倒数第k个结点。
*/
public static void main(String[] args) {
ListNode head = new ListNode();
ListNode second = new ListNode();
ListNode third = new ListNode();
ListNode forth = new ListNode();
head.nextNode = second;
second.nextNode = third;
third.nextNode = forth;
head.data = 1;
second.data = 2;
third.data = 3;
forth.data = 4;
Q15 test = new Q15();
ListNode result = test.findKToTail(head,3);
System.out.println(result.data);
}
public ListNode findKToTail(ListNode head, int k){
//合法性判断(表不为空,且要找的结点存在)
if(head == null || k == 0){
return null;
}
ListNode resultListNode = null;//用来存放倒数第K个结点
ListNode headListNode = head;
//循环找到第K个结点
for(int i=0; i < k; i++){
if(headListNode.nextNode != null){//保证第K个结点存在
headListNode = headListNode.nextNode;
}else {
return null;
}
}
resultListNode = head;
while(headListNode != null){//当到达表结点的尾结点时,headListNode.nextNode为空,此时resultListNode为到数第K个结点。
resultListNode = resultListNode.nextNode;
headListNode = headListNode.nextNode;
}
return resultListNode;
}
}