第十三题:链表中倒数第k个结点
此题思路比较简单:一般来说,链表的中只能从前往后遍历。此题要输出倒数第k个结点只有将倒数转换为正数。所有我们要知道这个链表总共有多少个结点,假若有L个结点,则倒数第k个结点就是正数的第L-k+1个结点。故我们只需要计算出链表的长度即可。
第十四题:反转链表
如果熟悉链表的同学这道题肯定不难,这道题的核心就是链表的头插法。只需要将原链表的结点依次取出并采用头插法的方式构造成一个新的链表即可。
第十五题:合并两个排序的链表
此题的思路是:先创建一个新的链表,然后同时遍历list1和list2。把小的结点以尾插法的方式插入到新的链表中,同时链表往后移动。直到有一个链表遍历完为止。最后把没有遍历完的链表直接接入新链表。还要注意的是,新链表在插入元素的过程中,指针要一直往后,所以要额外定义一个根节点来指向链表的表头。
第十六题:树的子结构
此题步骤:首先要在root1(潜在的父树)中到一个和root2(潜在子树)根节点值相等的结点,这样才能往下匹配。如果在root1中找到了一个和root2中根结点值相同的结点,那么就可以开始往下层比较。这个比较的过程可以新定义一个方法来执行,因为比较的过程也是一个递归的操作。最后返回一个布尔值,如果为true,即为root2是root1的子树。否则,在root1中找下一个与root2根节点值相同的结点再匹配。
第十七题:二叉树的镜像
此题较为简单,主要是在交换结点的过程中,交换的是结点,而不是结点值。
第十八题:顺时针打印矩阵
代码如下:
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> res = new ArrayList<>();
if(matrix == null || matrix.length == 0) return res;
int rowBegin = 0;
int rowEnd = matrix.length - 1;
int colBegin = 0;
int colEnd = matrix[0].length - 1;
while(rowBegin <= rowEnd && colBegin <= colEnd) {
// Traverse Right
for(int i = colBegin; i <= colEnd; ++i) {
res.add(matrix[rowBegin][i]);
}
rowBegin++;
// Traverse Down
for(int i = rowBegin; i <= rowEnd; ++i) {
res.add(matrix[i][colEnd]);
}
colEnd--;
// Traverse Left
if(rowBegin <= rowEnd) {
for(int i = colEnd; i >= colBegin; i--) {
res.add(matrix[rowEnd][i]);
}
rowEnd--;
}
// Traver Up
if(colBegin <= colEnd) {
for(int i = rowEnd; i >= rowBegin; i--) {
res.add(matrix[i][colBegin]);
}
colBegin++;
}
}
return res;
}
}