java数据结构知识点可以说在面试中是必问的,因为这是java知识当中的重点,所以我们在面试之前看一些java数据结构相关面试题肯定不会错,那下面来我们就来给大家的分享一下java数据结构面试题。
1.为什么我们需要数据结构?
数据是计算机科学当中最关键的实体,而数据结构则可以将数据以某种组织形式存储,因此,数据结构的价值不言而喻。
无论你以何种方式解决何种问题,你都需要处理数据——无论是涉及员工薪水、股票价格、购物清单,还是只是简单的电话簿问题。
数据需要根据不同的场景,按照特定的格式进行存储。有很多数据结构能够满足以不同格式存储数据的需求。
2.HashMap的工作原理是什么?
HashMap类有一个叫做Entry的内部类。这个Entry类包含了key-value作为实例变量。 每当往hashmap里面存放key-value对的时候,都会为它们实例化一个Entry对象,这个Entry对象就会存储在前面提到的Entry数组table中。Entry具体存在table的那个位置是 根据key的hashcode()方法计算出来的hash值(来决定)。
3.如何知道二叉树的深度?
实现二叉树的深度方式有两种,递归以及非递归。
①递归实现:
为了求树的深度,可以先求其左子树的深度和右子树的深度,可以用递归实现,递归的出口就是节点为空。返回值为0;
②非递归实现:
利用层次遍历的算法,设置变量level记录当前节点所在的层数,设置变量last指向当前层的最后一个节点,当处理完当前层的最后一个节点,让level指向+1操作。设置变量cur记录当前层已经访问的节点的个数,当cur等于last时,表示该层访问结束。
层次遍历在求树的宽度、输出某一层节点,某一层节点个数,每一层节点个数都可以采取类似的算法。
树的宽度:在树的深度算法基础上,加一个记录访问过的层节点个数最多的变量max,在访问每层前max与last比较,如果max比较大,max不变,如果max小于last,把last赋值给max;
import java.util.LinkedList; public class Deep { //递归实现1 public int findDeep(BiTree root) { int deep = 0; if (root != null) { int lchilddeep = findDeep(root.left); int rchilddeep = findDeep(root.right); deep = lchilddeep > rchilddeep ? lchilddeep + 1 : rchilddeep + 1; } return deep; } //递归实现2 public int findDeep1(BiTree root) { if (root == null) { return 0; } else { int lchilddeep = findDeep1(root.left); //求左子树的深度 int rchilddeep = findDeep1(root.left); //求右子树的深度 return lchilddeep > rchilddeep ? lchilddeep + 1 : rchilddeep + 1; //左子树和右子树深度较大的那个加一等于整个树的深度 } } //非递归实现 public int findDeep2(BiTree root) { if (root == null) return 0; BiTree current = null; LinkedListqueue = new LinkedList(); queue.offer(root); int cur, last; int level = 0; while (!queue.isEmpty()) { cur = 0; //记录本层已经遍历的节点个数 last = queue.size(); //当遍历完当前层以后,队列里元素全是下一层的元素,队列的长度是这一层的节点的个数 while (cur < last) //当还没有遍历到本层最后一个节点时循环 { current = queue.poll(); //出队一个元素 cur++; //把当前节点的左右节点入队(如果存在的话) if (current.left != null) { queue.offer(current.left); } if (current.right != null) { queue.offer(current.right); } } level++; //每遍历完一层level+1 } return level; } public static void main(String[] args) { BiTree root = BiTree.buildTree(); Deep deep = new Deep(); System.out.println(deep.findDeep(root)); System.out.println(deep.findDeep1(root)); System.out.println(deep.findDeep2(root)); } }
4.判断链表中是否出现了环?
单链表有环,是指单链表中某个节点的next指针域指向的是链表中在它之前的某一个节点,这样在链表的尾部形成一个环形结构。
// 链表的节点结构如下 typedef struct node { int data; struct node *next; } NODE;
最常用方法:
定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环形链表;如果走得快的指针走到了链表的末尾(next指向 NULL)都没有追上第一个指针,那么链表就不是环形链表。
通过使用STL库中的map表进行映射。首先定义 map
在进行java面试中,就算你是面试基础的java工作,也会问数据结构相关面试题,因此我们需要要掌握这方面知识!最后大家如果想要了解更多Java面试题知识,敬请关注奇Q工具网。
推荐阅读: