方法一:是用两个结点的引用p1,p2指向链表的表头,p1开始向前移动,当移动到第K个结点时,p2开始移动,那么p1,p2始终距离为K,当p1移动到链表的末尾时,p2就在倒数第K个结点处。
import java.util.Scanner;
public class GetListKey {
//得到倒数第K个结点
public static void getListKey(MyList mylist,int key){
MyList p1=null,p2=null;
int count=0;
for(p1=mylist,p2=mylist;p1.getList()!=null;){
p1=p1.getList();
count++;
if(count>=key){
p2=p2.getList();
}
}
System.out.println(p2.getNum());
}
public static void main(String[] args){
MyList mylist=PrintList.creatList();
Scanner s=new Scanner(System.in);
int key=s.nextInt();
GetListKey.getListKey(mylist, key);
}
}
方法二:第二中方法则是利用集合,将链表的内容存入集合中然后取倒数第K个结点
//利用集合的方式实现得到第K个结点
public static int getListKey2(MyList mylist,int key){
List<Integer> list=new ArrayList<Integer>();
for(MyList ml=mylist;ml.getList()!=null;ml=ml.getList()){
list.add(ml.getNum());
}
int i=list.size(),count=1;
while(i>=0&&count!=key){
System.out.println("i="+i);
++count;
--i;
}
if(i<0) return 0;
else {
System.out.println("倒数第K个数:"+list.get(i));
return list.get(i);
}
}