剑指 - 链表中倒数第k个结点
题目
输入一个链表,输出该链表中倒数第k个结点。
思路
两种方案,不过空间复杂度都为 O(n),可以考虑一种计数后再次遍历,空间复杂度 O(1),但写起来比较麻烦,这里就记录比较容易实现和理解的两种方案了
public class LinkListKthNode {
public ListNode FindKthToTail(ListNode head, int k) {
if (head == null || k == 0) {
return null;
}
return sol2(head, k);
}
//第一种方案 : 栈
private ListNode sol1(ListNode head, int k) {
Stack<ListNode> stack = new Stack<>();
while (head != null) {
stack.push(head);
head = head.next;
}
if (stack.size() < k) {
return null;
}
while (k > 1) {
stack.pop();
k--;
}
return stack.pop();
}
//第二种方案: 存下读取
private ListNode sol2(ListNode head, int k) {
ListNode p = head;
ArrayList<ListNode> list = new ArrayList<>();
while (p != null) {
list.add(p);
p = p.next;
}
if (list.size() < k) {
return null;
}
return list.get(list.size() - k);
}
} 总结
基础题,不用额外空间的写起来比较臃肿

京公网安备 11010502036488号