LinkedList以及栈的深度理解
算法背景:给定一个只包括 ‘(‘,’)‘,’{‘,’}‘,’[‘,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。
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();
}