解法1:快慢指针
快指针先走K-1步慢指针再出发,当快指针到结尾的时候时候,慢指针就到了倒数第K个节点
import java.util.*;
public class Solution {
public ListNode FindKthToTail (ListNode pHead, int k) {
if (pHead == null || k == 0) {
return null;
}
if (pHead.next == null && k == 1) {
return pHead;
}
if (pHead.next == null && k > 1) {
return null;
}
ListNode slow = pHead;
ListNode fast = pHead;
int count = 1;
while(count < k && fast.next != null) {
fast = fast.next;
count++;
}
if(count < k){
return null;
}
while(fast.next != null){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
解法2:借助
全部入栈之后,依次出栈,第k个出来的就是倒数第K个
import java.util.*;
import java.util.*;
public class Solution {
public ListNode FindKthToTail (ListNode pHead, int k) {
if (pHead == null || k == 0) {
return null;
}
Stack<ListNode> visited = new Stack<ListNode>();
while (pHead != null) {
visited.push(pHead);
pHead = pHead.next;
}
int count = 0;
ListNode result = null;
while(!visited.empty() && count < k) {
result = visited.pop();
count++;
}
if(count < k) {
return null;
}
return result;
}
}
解法3:递归
import java.util.*;
import java.util.*;
public class Solution {
int size = 0;
public ListNode FindKthToTail (ListNode pHead, int k) {
if (pHead == null || k == 0) {
return null;
}
ListNode node = FindKthToTail(pHead.next, k);
size++;
if(size < k) {
return null;
} else if (size == k){
return pHead;
} else {
return node;
}
}
}
参考牛客的一个帖子得到的办法

京公网安备 11010502036488号