算法背景:给定一个只包括 ‘(‘,’)‘,’{‘,’}‘,’[‘,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。

1 首先了解LinkedList的底层实现

1.1 LinkedList的底层实现

LinkedList的底层是基于 双向链表 实现,使用Node存储链表节点信息。源码如下  
private static class Node<E> {
    E item;
    Node<E> next;
    Node<E> prev;
}  
每个链表都存储了first和last指针;  
transient Node<E> first;
transient Node<E> last;  

2 设计算法,实现上面的需求

2.1 算法的实现

 public static boolean isValid(String s) {
        int n = s.length();
        if (n % 2 == 1) {
            return false;
        }

        Map<Character, Character> pairs = new HashMap<Character, Character>() {{
            put(')', '(');
            put(']', '[');
            put('}', '{');
        }};
        Deque<Character> stack = new LinkedList<Character>();
        for (int i = 0; i < n; i++) {
            char ch = s.charAt(i);
            if (pairs.containsKey(ch)) {
                if (stack.isEmpty() || !stack.peek().equals(pairs.get(ch))) {
                    return false;
                }
                stack.pop();
            } else {
                stack.push(ch);
            }
        }
        return stack.isEmpty();
 }   

2.2 算法的理解