数据结构总结——Java

1 链表(Linked List)

1.1 单项链表(Singly Linked List)

1.1.1 图例

1.1.2 Java实现

public class ListNode {
    
    
    // 保存值
    int val;

    // 保存指针
    ListNode next;

    // 构造函数们
    public ListNode() {
    
    
    }

    public ListNode(int val) {
    
    
        this.val = val;
    }

    public ListNode(int val, ListNode next) {
    
    
        this.val = val;
        this.next = next;
    }

    // 重写toString方法方便输出
    @Override
    public String toString() {
    
    
        return "ListNode{" +
                "val=" + val +
                ", next=" + next +
                '}';
    }
}

1.1.3 常见方法

1) 测试类,创建单项链表并输出

public class ListNodeTest {
    
    
    public static void main(String[] args) {
    
    
        // 创建节点
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);

        // 连起来
        node1.next = node2;
        node2.next = node3;
        node3.next = null;

        // 创建head指向链表头
        ListNode head;
        head = node1;
        System.out.println(head);
    }
}

// 输出:ListNode{val=1, next=ListNode{val=2, next=ListNode{val=3, next=null}}}

1.2 双向链表(Doubly Linked List)

1.2.1 图例

1.2.2 Java实现

public class Node {
    
    
    Node prev;
    int data;
    Node next;

    public Node() {
    
    
    }

    public Node(int data) {
    
    
        this.data = data;
    }

    public Node(Node prev, int data, Node next) {
    
    
        this.prev = prev;
        this.data = data;
        this.next = next;
    }

    @Override
    public String toString() {
    
    
        return "Node{" +
                "prev=" + prev +
                ", data=" + data +
                ", next=" + next +
                '}';
    }
}

1.2.3 常见方法

1) 测试类,创建双向链表并输出

public class NodeTest {
    
    
    public static void main(String[] args) {
    
    
        // 创建节点
        Node node1 = new Node(null, 1, null);
        Node node2 = new Node(node1, 2, null);
        Node node3 = new Node(node2, 3, null);
        Node node4 = new Node(node3, 4, null);

        // 连起来
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;

        // 输出双向链表
        // 定义临时node指向表头
        Node tmp = node1;
        while(tmp != null){
    
    
            System.out.println(tmp.data);
            tmp = tmp.next;
        }

    }
}

1.3 循环链表

2 二叉树(Binary tree)

2.1 图例

2.2 Java实现

public class TreeNodeTest {
    
    
    public static void main(String[] args) {
    
    
        // 创建二叉树并输出

        // 创建节点
        TreeNode root = new TreeNode(null, 1, null);
        TreeNode left = new TreeNode(null,2, null);
        TreeNode right = new TreeNode(null, 3, null);

        // 连接成树
        root.left = left;
        root.right = right;

        // 输出二叉树
        // 先序遍历 中序遍历 后序遍历
    }
}

3 栈(Stack FILO:先进后出)

3.1 图例

3.2 Java实现

可以基于数组或链表来构建

public class Stack {
    
    
    // 数据
    Object[] data;
    // 当前栈大小
    int size;

    // 初始化栈
    public Stack(int length) {
    
    
        data = new Object[length];
    }

    // 入栈
    public void push(Object ele){
    
    
        if(size >= data.length){
    
    
            throw new RuntimeException("栈已满");
        }
        data[size] = ele;
        size++;
    }

    // 出栈
    public Object pop(){
    
    
        if(size <= 0){
    
    
            throw new RuntimeException("栈已空");
        }

        Object obj = data[size - 1];
        data[size - 1] = null;
        size--;
        return obj;

    }

    // 遍历输出栈
    public void output(){
    
    
        for(int i = size-1; i >= 0; i--){
    
    
            System.out.println(data[i]);
        }
    }

}

3.3 测试类,创建栈并输出

public class StackTest {
    
    
    public static void main(String[] args) {
    
    
        // 初始化栈
        Stack s = new Stack(3);

        // 元素入栈
        s.push('A');
        s.push('B');
        s.push('C');

        // 超过容量
//        s.push('D');
        // 输出
        s.output(); // C B A

        // 元素出栈
        s.pop();
        s.pop();

        // 输出
        s.output(); // A


    }
}

4 队列(Queue FIFO:先进先出)

4.1 图例

4.2 Java实现

public class Queue {
    
    
    // 保存数据
    Object[] values;

    // 记录存储的元素个数
    int size;

    // 构造函数
    public Queue(int length) {
    
    
        values = new Object[length];
    }

    // 向队列中添加元素
    public void add(Object ele) {
    
    
        if(size >= values.length){
    
    
            throw new RuntimeException("队列已满 添加失败");
        }

        values[size] = ele;
        size++;
    }

    // 从队头删除元素
    public Object get() {
    
    
        if(size <= 0) {
    
    
            throw new RuntimeException("队列已空  获取失败");
        }

        // 取队头元素
        Object obj = values[0];

        // do something
        for(int i = 0; i < size-1; i++){
    
    
            values[i] = values[i+1];
        }
        // 最后一个元素置空
        values[size - 1] = null;
        size--;

        return obj;
    }

    // 输出队列内容
    public void output() {
    
    
        for(int i = 0; i < size; i++){
    
    
            System.out.println(values[i]);
        }
    }
}

4.3 测试类,创建队列并输出

public class Queue {
    
    
    // 保存数据
    Object[] values;

    // 记录存储的元素个数
    int size;

    // 构造函数
    public Queue(int length) {
    
    
        values = new Object[length];
    }

    // 向队列中添加元素
    public void add(Object ele) {
    
    
        if(size >= values.length){
    
    
            throw new RuntimeException("队列已满 添加失败");
        }

        values[size] = ele;
        size++;
    }

    // 从队头删除元素
    public Object get() {
    
    
        if(size <= 0) {
    
    
            throw new RuntimeException("队列已空  获取失败");
        }

        // 取队头元素
        Object obj = values[0];

        // do something
        for(int i = 0; i < size-1; i++){
    
    
            values[i] = values[i+1];
        }
        // 最后一个元素置空
        values[size - 1] = null;
        size--;

        return obj;
    }

    // 输出队列内容
    public void output() {
    
    
        for(int i = 0; i < size; i++){
    
    
            System.out.println(values[i]);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/COINVK/article/details/129960795