下面我用两种方法求解:
第一种方法:通常我们做这种题就是求出链表的长度=length,然后呢length-k的值就是我们要从链表头部走几步就可以了,代码解释:
java
public class Solution {
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public ListNode FindKthToTail(ListNode head,int k) {
int length=0;
ListNode cur=head;//为了不改变head的指向,定义临时变化指针
while (cur!=null){
cur=cur.next;
length++;
}
if(k<0 || k>length)return null;//k值越界
cur=head;
for (int i = 0; i <length-k ; i++)
cur=cur.next;
return cur;
}
}
第二种方法,我们先定义两个指向head的指针,分别是fast和slow,让fast先走(k-1)步后fast和slow一起每次都走一步,当fast.next的值是null结束,这样fast和slow之间永远相差k个元素,我们值遍历一次链表就可以找到倒数第k个值,画图解释:
fast先走k-1步:
fast和slow一起走,每次一步:
代码实现:
java
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ListNode fast=head,slow=head;
if(k<=0)return null;
if (head==null)return null;
for (int i = 0; i <k-1 ; i++){
if (fast.next!=null)fast=fast.next;
else {
return null;//fast.next==null,但是k还没有走完,证明k值不合法太大了
}
}
//k值合法
while (fast.next!=null){
fast=fast.next;
slow=slow.next;
}
return slow;
}
}