最近开始刷leetcode,发现许多题目都是算法题,题中涉及到了各种数据结构的实现与拓展。虽然大二上学过数据结构与算法,但是现在已经忘了许多,现在借此机会复习以下。数据结构与算法均使用java语言代码实现。

(一)线性结构

线性表是一种最常用且最简单的数据结构,它是n个元素的有限序列。一般来说实现线性表有两种方法,一种是采用连续存储空间的数组,另一种是采用链表。
(1)数组
数组是一种采用连续空间存储,大小固定的数据结构。一般来说,每种编程语言都已经实现了数组这种常用结构,只需创建调用即可。
java语言中可以通过以下的语句创建数组:

int[] array = new int[5];

数组一般定义时必须指名长度,若出现新添元素超出数组长度,一般可采用以下方法解决:
(1)创建一个更长的数组,将所有元素移到该数组中。
(2)采用一些例如ArrayList的集合类替代数组。
数组的优点是可以利用下标来访问数组元素,较为高效,缺点是每次进行数组元素的增删时,需要重新移动整个数组,效率低下。

(2)链表
链表是一种物理上非连续的数据结构,链表的顺序由它的指针实现。一般来说,链表有单向链表,双向链表和循环链表,下面以单链表的实现为例:

class Node{
    //指针与数据
    Node next = null;
    int data;

    //构造器
    Node(int element){
        this.data = element;
        this.next = null;
    }
 }
 //调用
 Node node1 = new Node(5);
 Node node2= new Node(6);
 node1.next = node2;

(3)栈
栈是一种比较特殊的线性结构。对于栈来说,数据只能从栈顶进入(push),也只能从栈顶出去(pop),这是一种后进先出的思想。你只能访问栈的栈顶元素。在java中存在Stack类,对应栈这种数据结构,使用方法如下:

Stack<String> stringStack = new Stack<>();
stringStack.push("hello");
stringStack.push("World");
String s1 = stringStack.pop();

当然,由于栈是一种特殊的表,你也可以利用Java中提供的各种表的基础之上实现栈结构。

(4)队列
和栈类似,队列也是一种特殊的线性结构。在队列中,你只能从队列的尾部加入数据,访问队列的首部数据。这是一种后进后出的思想。在java中存在Queue接口,对应队列这种数据结构,具体使用方法如下:

Queue<Integer> integerQueue = new LinkedList<>();
integerQueue.add(1);
integerQueue.add(2);
int i1 = integerQueue.remove();
System.out.println(i1);

注意:java中并没有Queue类,但是java中的LinkList实现了Queue接口。

(二)非线性结构

(1)二叉树

树是一种非常重要的数据结构,这里以二叉树为例介绍这种数据结构。二叉树是一种具有层级结构的数据结构,具体结构如下图所示:

java数据结构及算法视频 java数据结构知识点总结_数据结构


关于树的知识点还有很多。

二叉树的性质(各层结点规律)。。。

二叉树的遍历方法(前中后序)。。。

二叉树的分类(满二叉树)。。。

各种基于二叉树的树(红黑树)。。。

这里由于篇幅不多介绍。二叉树的实现代码如下:

class doubletree{
    doubletree left = null;
    doubletree right = null;
    int treedata;
    
    //构造器
    public doubletree(int treedata){
        this.treedata = treedata;
    }
}

(2)图

图,是一种比树更为复杂的数据结构。树的节点之间是一对多的关系,并且存在父与子的层级划分;而图的顶点(注意,这里不叫节点)之间是多对多的关系,并且所有顶点都是平等的,无所谓谁是父谁是子。图的结果如下所示:

java数据结构及算法视频 java数据结构知识点总结_Stack_02


可以采用邻接矩阵或者邻接表实现图。

可以参考链接:漫画,你为什么要去了解图