这道题考察了边界条件,首先得判断链表的长度得小于或者等于k,然后按照先将一个指针移动到k-1的位置,再用一指针指向头部和它一起移动,直到第一个指针到底,这样时间复杂度为O(N),代码如下
public class LastK {
class No{
public int data;
public No next;
public No() {
// TODO Auto-generated constructor stub
data = 0;
next = null;
}
}
LastK(){
buildList();
System.out.println("all numbers are:");
showAll();
System.out.println("last "+5+" number is:");
System.out.println(findLastK(head,5));
}
private No head;
void showAll(){
No pNo = head;
while(pNo!=null){
System.out.print(pNo.data);
pNo=pNo.next;
}
System.out.println();
}
public void buildList(){
head = new No();
head.data = 0;
No cur = head;
for(int i = 0; i < 10;i++){
No newNode = new No();
newNode.data = i+1;
cur.next = newNode;
cur = newNode;
}
}
public int findLastK(No hNo,int k){
if(hNo==null) return -1;
No p1 = hNo;
No p2 = hNo;
while(k!=0){
p1 = p1.next;
if(p1==null) return -1;
k--;
}
while(p1!=null){
p1=p1.next;
p2=p2.next;
}
return p2.data;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
LastK lk = new LastK();
}
}