思路一:首先求出整个链表的长度,如果要求倒数第 k 个结点,就相当于求第 n - k + 1 个结点,遍历链表,如果到达 n - k + 1 个就返回结果即可。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
/*
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 temp = head;
int n = 0;
while(temp != null) {
++ n;
temp = temp.next;
}
k = n - k + 1;
int cnt = 0;
while(head != null) {
++ cnt;
if(cnt == k) return head;
head = head.next;
}
return head;
}
} 思路二:快慢指针,首先我们设置两个指针 l, r。刚开始让 l 指针指向链表的第一个元素,然后 r 指针指向第 k + 1 的元素,如果在这个过程中 r 指针提前到达了 null,说明 k 大于 n,此时返回 null即可,最后我们让 l 和 r 同时移动,直到 r 指针移动到最后一个 null 的位置即可,这样在 l 和 r 之间就包含了 k 个元素,l 指针指向的就是倒数第 k 个元素。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
/*
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 l = head, r = head;
while(k -- > 0) {
if(r != null) r = r.next;
else return null;
}
while(r != null) {
r = r.next;
l = l.next;
}
return l;
}
} 
京公网安备 11010502036488号