剑指 - 链表中倒数第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);
    }
}

总结

基础题,不用额外空间的写起来比较臃肿