思路:
1.先遍历一次获得链表长度n
,然后从头开始走n - k
步即可
2.快慢指针,先让快指针走k
步,然后两个指针同时前进,当快指针遍历完链表时,返回 slow 即可。
注意循环条件,如果是fast != null
,应该走k
步,如果是fast.next != null
,应该走k - 1
步。
思路1
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
if(head == null) return null;
int n = 0;
ListNode tmp = head;
while(tmp != null){
n++;
tmp = tmp.next;
}
for(int i = 0; i < n - k; i++){
head = head.next;
}
return head;
}
}
思路2:走k-1
步,循环条件为fast.next != null
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode slow = head;
ListNode fast = head;
while(k - 1 != 0){
fast = fast.next;
k--;
}
while(fast.next != null){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
走k
步,循环条件为fast != null
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode slow = head, fast = head;
for(int i = 0; i < k; i++){
fast = fast.next;
}
while(fast != null){
fast = fast.next;
slow = slow.next;
}
return slow;
}
}