方法一:
使用快慢指针,因为是倒数第k个节点,如果链表的长度为size,那么正着数应该就是第size-k+1或者写为:size -(k-1)个,那么第一个指针先走k-1步,剩下size -(k-1)步,第二个节点和第一个节点 一起走,这样第一个节点到头了,第二个节点所在的位置就是我们要求的节点了。
这里对于我个人来说比较容易晕的一点是 size-k+1,因为是第多少步的,开始计数是从1而不是0开始,所以size要加上1再减去k
import java.util.*;
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k <= 0){
return null;
}
else{
ListNode first = head;
ListNode last = head;
for(int i = 1 ; i < k ; i++){
if(first.next == null){ // k大于链表的长度
return null;
}else{
first = first.next;
}
}
while(first.next != null){
first = first.next;
last = last.next;
}
return last;
}
}
}
方法二:
可以创建一个ArrayList来存放所有的链表数据,动态数组是可以直接用 .get()方法查询数据的
创建好的数组 ,里面(索引,从0开始)第size-k就是要查询的元素
import java.util.*;
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ArrayList<ListNode> arr = new ArrayList<>();
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
while(dummyHead.next != null){
arr.add(dummyHead.next);
dummyHead = dummyHead.next;
}
if(k > arr.size() || k <= 0){
return null;
}else{
int l = arr.size() - k;
return arr.get(l);
}
}
}