java数据结构

链表

线性表,但不会按线性的顺序存储数据,而是每一个节点里存着下一个节点的指针
链表和数组都是线性数据结构

  • 数组不便于做删除、插入,但遍历查找简单,有固定长度
  • 链表适合插入、删除,不宜过长,否则导致遍历性能下降
public class LinkedList{
    public static void main(String[] args) {
        NodeManager nm = new NodeManager();
        for(int i=0;i<=5;i++){
            nm.addData(i+1);
        }
        nm.deleteData(3);
        boolean a = nm.updateData(4, 7);
        nm.showData();
        boolean b = nm.findData(7);
        System.out.println(a);
        System.out.println(b);
        nm.insertData(3,20);
        nm.showData();
    }
}

class NodeManager{
    public Node root;//根节点
    private int currentIndex=0;//节点位置
    //提供给外部访问的接口
    public void addData(int data){
        if(root == null){
            root = new Node(data);
        }else{
            root.addData(data);
        }
    }
    public void deleteData(int data){
        if(root==null){
            System.out.println("无节点可删除");
        }else if(root.getData() == data){
            root = root.next;
            System.out.println("删除成功");
        }else{
            root.deleteData(data);
        }
    }
    public boolean findData(int data){
        if(root==null)return false;
            if(root.getData()==data){
                return true;
            }else{
                return root.findData(data);
            }
    }
    public boolean updateData(int oldData,int newData){
        if(root==null)return false;
        if(root.getData()==oldData){
            root.setData(newData);
            return true;
        }else{
            return root.updateData(oldData,newData);
        }
    }
    public void insertData(int index,int newData){
        //index为插入位置,在其前插入
        if(index<0)return;
        currentIndex = 0;
        if(index==currentIndex){
            Node newNode = new Node(newData);
            newNode.next = root;
            root = newNode;
        }else{
            root.insertData(index,newData);
        }
    }
    public void showData(){
        if(root==null){
            System.out.println("当前数据为空");
        }else{
            System.out.print(root.getData()+"->");
            root.showData();
        }
    }
    private class Node{
        private int data;//存储的数据
        private Node next;//存储下一个节点
        public Node(){}
        public Node(int data){
            this.data = data;
        }
        public void setData(int data){
            this.data = data;
        }
        public int getData(){
            return this.data;
        }
        //添加节点
        public void addData(int data){
            if(next==null){
                next = new Node(data);
            }else{
                next.addData(data);
            }
        }
        //删除节点
        public void deleteData(int data){
            if(this.next!=null){
                if(this.next.data==data){
                    this.next = this.next.next;
                }else{
                    this.next.deleteData(data);
                }
            }  
        }
        //查找节点
        public boolean findData(int data){
            if(this.next!=null){
                if(this.next.data==data){
                    return true;
                }else{
                    return this.next.findData(data);
                }
            }
            return false;
        }
        //更改节点
        public boolean updateData(int oldData,int newData){
            if(this.next!=null){
                if(this.next.data==oldData){
                    this.next.data = newData;
                    return true;
                }else{
                    return this.next.updateData(oldData, newData);
                }
            }
            return false;
        }
        //插入节点
        public void insertData(int index,int newData){
            currentIndex++;
            if(index==currentIndex){
                Node newNode = new Node(newData);
                newNode.next = this.next;
                this.next = newNode;
            }else{
                this.next.insertData(index, newData);
            }
        }
        //显示所有节点
        public void showData(){
            if(next!=null){
                System.out.print(next.data+"->");
                next.showData();
            }
        }
    }
}

二叉树

public class BinaryTreeDemo {
    public static void main(String[] args) {
        BinaryTree bt = new BinaryTree();
        bt.add(2);
        bt.add(3);
        bt.add(1);
        bt.add(5);
        bt.add(3);
        bt.show();
    }
}

//二叉树
class BinaryTree {

    private Node root;

    // 外部提供使用接口
    public void add(int data) {
        if (this.root == null) {
            root = new Node(data);
        } else {
            root.addNode(data);
        }
    }

    public void show() {
        if(root == null) {
            System.out.println("数据不存在");
        }else {
            root.showNode();
        }
    }

    private class Node {
        private int data;
        private Node left;
        private Node right;

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

        // 添加操作
        private void addNode(int data) {
            if (this.data >= data) {
                if (this.left == null) {
                    this.left = new Node(data);
                } else {
                    this.left.addNode(data);
                }
            } else {
                if (this.right == null) {
                    this.right = new Node(data);
                } else {
                    this.right.addNode(data);
                }
            }
        }

        // 显示操作
        //中序遍历
        private void showNode() {
            if(this.left != null) {
                this.left.showNode();
            }
            System.out.print(this.data+"->");
            if(this.right != null) {
                this.right.showNode();
            }
        }
    }

}