Java简单数据结构

线性表

顺序存储

理解:一组元素,从逻辑上连续,且存储在连续的物理地址上。在高级编程语言中就是数组。

定义数组arrays,长度为4,初始值都是0。arrays=[0, 0, 0, 0]

int[] arrays = new int[4];

添加元素。arrays=[2, 7, 5, 9]

arrays[0]=2;
arrays[1]=7;
arrays[2]=5;
arrays[3]=9;

插入元素,在位置2插入元素"3",后面元素后移。arrays1=[2, 7, 3, 5, 9]

//新建数组arrays1
int[] arrays1 = new int[arrays.length+1];
System.arraycopy(arrays,0,arrays1,0,arrays.length);
//元素后移
for(int i=arrays1.length-2;i>1;i--){
    arrays1[i+1] = arrays1[i];
}
//插入元素3
arrays1[2]=3;

删除元素"7",后面元素前移。arrays=[2, 3, 5, 9]

for(int i=2;i<arrays1.length;i++){
    arrays1[i-1] = arrays1[i];
}
System.arraycopy(arrays1,0,arrays,0,arrays.length);

链式存储

理解:每个元素都有当前类型的引用,来指向下一个元素。

单链表

定义一个单链对象

class ListNode{
    int value; //保存的值
    ListNode next; //下一个元素
}

添加节点,rootNode -> node1 -> node2

ListNode rootNode = new ListNode();
rootNode.value=0;
ListNode node1 = new ListNode();
node1.value=1;
rootNode.next = node1;
ListNode node2 = new ListNode();
node2.value=2;
node1.next = node2;

遍历节点

ListNode currNode = rootNode;
while (currNode!=null){
    System.out.println(currNode.value);
    currNode = currNode.next;
}

删除节点,原理:把待删元素的上一个元素的next指向下一个元素。rootNode -> node2

rootNode.next = node2;//删除node1

循环链表

理解:链表中的最后一个元素的next指向第一个元素,使之头尾相接。

node2.next = rootNode;

双向链表

理解:每个元素都有两个当前类型的引用(prev,next),prev指向上一个元素,next指向下一个元素。

class ListNode{
    int value;
    ListNode prev;
    ListNode next;
}

理解:仅在一个线性表的一端做操作

定义栈对象

class ListStack{
    String[] data = new String[10];//初始栈深为10
    int top = -1; //初始指针为-1
}

入栈

//入栈
ListStack listStack = new ListStack();
listStack.data[++listStack.top]="A";
listStack.data[++listStack.top]="B";
listStack.data[++listStack.top]="C";

出栈

String topData = listStack.data[listStack.top--];

队列

理解:一个线性表,一端做添加,另一端做删除。

定义队列

class ListQueue{
    String[] data = new String[10];//初始队列长度为10
    int front = -1; //头指针为-1
    int rear = -1; //尾指针为-1
}

入队

//入队
ListQueue queue = new ListQueue();
queue.front = ++queue.rear;
queue.data[queue.rear]="A";
queue.data[++queue.rear]="B";
queue.data[++queue.rear]="C";
queue.data[++queue.rear]="D";

出队

String data = queue.data[queue.front++];

多维数组

理解:就是数组嵌套

定义二维数组

int[][] arrays = {{11,12,13,14},{15,16,17,18},{19,20,21,22},{23,24,25,26},{27,28,29,30},{31,32,33,34}};
//打印
11 12 13 14 
15 16 17 18 
19 20 21 22 
23 24 25 26 
27 28 29 30 
31 32 33 34

数组转置

int[][] reverse = new int[4][6];
for (int i=0;i< arrays.length;i++){
    for(int j=0;j<arrays[i].length;j++){
        //reverse[arrays[i].length-1-j][i]=arrays[i][j];//这个是逆转90度
        reverse[j][i]=arrays[i][j];//这个是转置
    }
}
//打印
11 15 19 23 27 31 
12 16 20 24 28 32 
13 17 21 25 29 33 
14 18 22 26 30 34

矩阵压缩存储

广义表

一组元素中,每个元素不一定必须是原子级数据,形如:[“A”,“B”,“C”,1,2,3,4]。
典型的HashMap就是数组+链表,或者数组+树,形如:[(node -> node1 -> node2),(二叉树),(红黑树)]

定义Node对象

class Node{
    int hashCode;
    String key;
    String value;
    Node next;
    Node(String key,String value,Node next){
        this.hashCode = key.hashCode();
        this.key = key;
        this.value = value;
        this.next=next;
        System.out.println(this.hashCode+" "+ this.key);
    }
}

Node数组

Node[] arrays = new Node[10];//长度为10的数组

数组中添加两个Node

arrays[0]= new Node("Aa","Aa-value",null);
arrays[1]= new Node("CC","CC-value",null);

再添加一个Node,此key的hashcode与arrays[0]的一样,需后插node

arrays[0].next=new Node("BB","BB-value",null);

遍历

for(int i =0;i<arrays.length;i++){
    Node node = arrays[i];
    if(node!=null)System.out.println("当前数组下标:"+ i);
    Node curr = node;
    for(;curr!=null;curr=curr.next){
        System.out.println(curr.hashCode+" "+ curr.key+" "+curr.value);
    }
}
//打印
当前数组下标:0
2112 Aa Aa-value
2112 BB BB-value
当前数组下标:1
2144 CC CC-value

二叉树

理解:

定义ListNode,具有左右node节点。

class ListNode{
    String value;
    ListNode left;
    ListNode right;
}

添加数据,构建一颗树(待增加一张图片,看起来更直观)

ListNode nodeA= new ListNode();
nodeA.value = "A";
ListNode nodeB= new ListNode();
nodeB.value = "B";
nodeA.left=nodeB;

ListNode nodeC= new ListNode();
nodeC.value = "C";
nodeA.right=nodeC;

ListNode nodeD= new ListNode();
nodeD.value = "D";
nodeB.left=nodeD;

ListNode nodeE= new ListNode();
nodeE.value = "E";
nodeB.right=nodeE;

ListNode nodeF= new ListNode();
nodeF.value = "F";
nodeC.left=nodeF;

ListNode nodeG= new ListNode();
nodeG.value = "G";
nodeC.right=nodeG;

ListNode nodeH= new ListNode();
nodeH.value = "H";
nodeD.right=nodeH;

ListNode nodeI= new ListNode();
nodeI.value = "I";
nodeE.right=nodeI;

ListNode nodeJ= new ListNode();
nodeJ.value = "J";
nodeI.left=nodeJ;

ListNode nodeK= new ListNode();
nodeK.value = "K";
nodeI.right=nodeK;

前序遍历,ABDHEIJKCFG

public void preList(ListNode node){
    if(node!=null){
        System.out.print(node.value);
        preList(node.left);
        preList(node.right);
    }
}

中序遍历,DHBEJIKAFCG

public void inList(ListNode node){
    if(node!=null){
        inList(node.left);
        System.out.print(node.value);
        inList(node.right);
    }
}

后序遍历,HDJKIEBFGCA

public void postList(ListNode node){
    if(node!=null){
        postList(node.left);
        postList(node.right);
        System.out.print(node.value);
    }
}

森林

哈夫曼树

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简单就好-怒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值