方法一:利用size变量
在结点的类里定义size参数,private int size; //记录链表的个数
当对链表进行插入和删除时,分别要对size进行加减操作。因此,size记录的是链表的个数。
public static <T extends Comparable<T>>SingleLink.Entry<T> getLastK(SingleLink<T> link,int k){
if(link == null || k>link.size() || k<=0){
return null;
}
SingleLink.Entry<T> p = link.getHeadEntry();
int size = link.size();
int count = size - k;
while(count > 0){
p = p.getNext();
count--;
}
return p;
}
方法二:长表先走差值布
1.定义两个结点p、q,p=head,q=head;
2.p 先走k个节点 ,q不动
3. p和q同时向后走,p==null,此时q保存的倒数第k个节点
public static <T extends Comparable<T>>SingleLink.Entry<T> getLastK(SingleLink<T> link,int k){
if(link == null || k <= 0 || k > link.size()){
return null;
}
//1.定义p,q
SingleLink.Entry<T> head = link.getHeadEntry();
SingleLink.Entry<T> p = head,q = head;
//2.p先走k个结点
while(k > 0){
p = p.getNext();
k--;
}
//3.p,q同时走,p==null停止
while(p != null){
p = p.getNext();
q = q.getNext();
}
return q;
}