题目:i输入一个链表,输出链表的倒数第K个结点
本体考虑到链表的特殊性问题,如果按照一般思路思考,我们可以先将链表遍历到最后一个结点,然后再从前向后遍历找到倒数第k个结点。但是链表不允许从后向前进行遍历,所以这种方法我们不考虑。为了解决这个问题,我们可以使用两个指针,当然Java里不包括指针,这里可以称作游标。我们考虑到倒数第k个结点,就是第n-k+1个结点,我们可以让两个游标都指向head头结点,然后让一个结点先向后移动K个位置,然后再将两个游标同时移动到最后一个结点。后一个结点所指向的就是倒数第K个结点。
注意:我们需要考虑如下几个问题:
1、如果K的值小于零或者链表为空的情况怎么办,这显然是不符合规定的。
2、如果K的值超出了链表长度怎么办。
我们都需要考虑到这些问题,要不我们的程序会出现很多没有必要的问题,下面我们来看具体的代码展示:
public class BackK {
public static Node p1;
public static Node p2;
public static Node FindKthToTail(Node head,int k){
if(head.next==null||k<=0)return null;//如果链表为空或者K值小于等于O情况下,返回空
else{
p1=head;
p2=head;
for(int i=0;i<k;i++){
if(p1.next!=null){
p1=p1.next;
}
else {
return null;//这种情况是超出了链表的范围的情况
}
}
while(p1.next!=null){//如果符合查找的前驱条件的话,两个游标一起移动
p1=p1.next;
p2=p2.next;
}
return p2;//返回后一个指针
}
}