题目一:
25. K 个一组翻转链表https://leetcode.cn/problems/reverse-nodes-in-k-group/题目要求:
思路:建立虚拟头结点,并采用头尾节点,使用常规翻转的函数进行翻转。 具体见代码逻辑。
注意:一定注意好翻转后的尾结点和下一组的头结点,以便建立连接。同时注意翻转后的左右边界和更新左右边界问题。
代码:
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
// 1. 建立虚拟头结点
ListNode dummy = new ListNode(0);
dummy.next = head;
// 2.令start = end = dummy 作为一组的头结点和尾节点
ListNode start = dummy, end = dummy;
while (true){
// 3.先确定下当前组是否需要翻转,如果end = null 说明已经是最后几个元素但不构成一组了
for (int i = 0; i < k && end != null; i++)
end = end.next;
if (end == null) break;
// 4.确定需要翻转了, 先记录下翻转后的头结点startNext 和 下一组的头结点endNext 方便连起来
ListNode startNext = start.next;
ListNode endNext = end.next;
// 5.把当前组暂时隔离起来
end.next = null;
// 6.使用自定义函数reverse进行翻转, 确定翻转后的左边界start.next
start.next = reverse(start.next);
// 7.确定右边界且与下一组的头结点连接上
startNext.next = endNext;
// 8.更新下左右边界
start = end = startNext;
}
return dummy.next;
}
// 翻转 eg. 1->2->3 翻转为 1<-2<-3
ListNode reverse(ListNode head){
ListNode cur = head, pre = null;
while (cur != null){
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
题目二:
230. 二叉搜索树中第K小的元素https://leetcode.cn/problems/kth-smallest-element-in-a-bst/
思路:直接利用二叉搜索树的顺序关系,利用中序遍历进行获取即可
代码:
class Solution {
public int kthSmallest(TreeNode root, int k) {
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (!stack.isEmpty() || cur != null){
if (cur != null){
stack.push(cur);
cur = cur.left;
}else {
cur = stack.pop();
k --;
if (k == 0) break;
cur = cur.right;
}
}
return cur.val;
}
}
题目三:
199. 二叉树的右视图https://leetcode.cn/problems/binary-tree-right-side-view/
思路:利用层序遍历,找到每次遍历的最后一个节点,就一定是最右边的结点。
代码:
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> list = new ArrayList<>();
Deque<TreeNode> queue = new LinkedList<>();
if (root != null) {
queue.offer(root);
}
while (!queue.isEmpty()) {
int len = queue.size();
TreeNode lastNode = null; // 记录当前层的最后一个节点
while (len-- > 0){
TreeNode cur = queue.poll();
lastNode = cur;
// 最后一次循环时,就一定到达了最右边上的节点 add值即可
if (len == 0) list.add(cur.val);
if (cur.left != null) queue.offer(cur.left);
if (cur.right != null) queue.offer(cur.right);
}
}
return list;
}
}