18链表中倒数第k个节点–剑指offer,java版
题目描述
输入一个链表,输出该链表中倒数第k个结点。
若从头到尾遍历链表,每经过一个节点,计数器加1的话,需要遍历链表两次,第一次统计出链表中节点的个数,第二次找到倒数第K个节点。
故可定义两个指针,这样只遍历一次。
第一个指针从头指针开始向前走k-1步,第二个指针不动
从第k个指针开始,第二个指针也开始向前遍历,这样两个指针的距离保持在k-1.
当第一个走到链表的尾节点时,第二个指针指向的就是倒数第k个节点
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k == 0) return null;
ListNode pa = head;
ListNode pb = null;
for(int i = 0; i < k - 1; i++){
if( pa.next != null) //防止链表的节点总数小于k
pa = pa.next;
else return null;
}
pb = head;
while(pa.next != null){
pa = pa.next;
pb = pb.next;
}
return pb;
}
}