题目链接:链表中倒数最后k个结点
方法一:快慢指针
public class Solution {
public ListNode FindKthToTail (ListNode pHead, int k) {
if (pHead == null || k == 0) {
return null;
}
ListNode fast = pHead, slow = pHead;
// 快指针先走 k 步
while (k-- > 0) {
if (fast == null) {
return null;
}
fast = fast.next;
}
// 当快指针到达末尾时,慢指针到达倒数第 k 个结点
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
}
方法二:先统计长度再找最后 k 个
public class Solution {
public ListNode FindKthToTail (ListNode pHead, int k) {
if (k == 0) {
return null;
}
// 用于统计长度
int count = 0;
ListNode node = pHead;
while (node != null) {
count++;
node = node.next;
}
if (k > count) {
return null;
}
node = pHead;
while (count > k) {
node = node.next;
count--;
}
return node;
}
}
方法三:栈
public class Solution {
public ListNode FindKthToTail (ListNode pHead, int k) {
if (k == 0) {
return null;
}
ArrayDeque<ListNode> stack = new ArrayDeque<>();
while (pHead != null) {
stack.push(pHead);
pHead = pHead.next;
}
if (k > stack.size()) {
return null;
}
while (--k > 0) {
stack.pop();
}
return stack.pop();
}
}
方法四:递归
public class Solution {
/**
* 递归往回走时访问的结点个数
*/
private int count;
public ListNode FindKthToTail (ListNode pHead, int k) {
if (pHead == null) {
return null;
}
ListNode node = FindKthToTail(pHead.next, k);
if (++count == k) {
return pHead;
}
return node;
}
}