java数据结构面试题有哪些?java数据结构面试题顺序表

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表进行映射。首先定义 mapm; 将一个 NODE * 指针映射成数组的下标,并赋值为一个 int 类型的数值。然后从链表的头指针开始往后遍历,每次遇到一个指针p,就判断 m[p] 是否为0。如果为0,则将m[p]赋值为1,表示该节点第一次访问;而如果m[p]的值为1,则说明这个节点已经被访问过一次了,于是就形成了环。

在进行java面试中,就算你是面试基础的java工作,也会问数据结构相关面试题,因此我们需要要掌握这方面知识!最后大家如果想要了解更多Java面试题知识,敬请关注奇Q工具网。

推荐阅读:

json语法规则是什么?json语法详解

Qt怎么使用?Qt使用教程之安装方法

javaweb如何实现支付功能?javaweb实现简单支付功能