三个谷歌算法题的Java解答,并配以图解说明。
1. 反转链表
题目描述:
给定一个单链表的头节点 head
,编写一个函数来反转链表,并返回新的头节点。
Java 解答:
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
图解:
- 初始化两个指针:
prev
(初始为null
)和curr
(指向头节点head
)。 - 遍历链表,每次迭代中,将
curr
的next
指针指向prev
。 - 更新
prev
和curr
,直到curr
为null
。 - 返回新的头节点,即
prev
。
2. 二叉树的最大深度
题目描述:
给定一个二叉树,找出其最大深度。
Java 解答:
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
} else {
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
return Math.max(leftDepth, rightDepth) + 1;
}
}
图解:
- 如果根节点为
null
,返回深度0
。 - 递归计算左子树和右子树的最大深度。
- 返回左右子树深度的最大值加
1
(当前节点的深度)。
3. 有效的括号
题目描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
Java 解答:
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
} else {
if (stack.isEmpty()) return false;
char top = stack.pop();
if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
return false;
}
}
}
return stack.isEmpty();
}
图解:
- 使用栈来存储开括号。
- 遍历字符串中的每个字符:
- 如果是开括号,压入栈中。
- 如果是闭括号,检查栈顶元素是否与之匹配。如果不匹配或栈为空,则返回
false
。
- 遍历完成后,如果栈为空,则字符串有效,否则无效。