二叉树链表简单模型

package myc.java.util;

//链表类,供外界调用
public class Link {
    //内部封装类Note,进行链表的数据逻辑关系处理
    //采用内部类的原因为:Link类可以之间访问Note内部类的私有属性,并且Note对外界来说是安全的,外界无法访问
    private class Note {
        private Object data;
        private Note next;

        public Note(Object data) {
            this.data = data;
        }

        public void addNote(Object obj) {
            if (this.next == null) {
                this.next = new Note(obj);
            } else {
                this.next.addNote(obj);
            }
        }

        public boolean containsNote(Object obj) {
            if (this.next != null) {
                if (this.next.data.equals(obj)) {
                    return true;
                }
                return this.next.containsNote(obj);
            }
            return false;
        }

        public Object getNote(int index) {
            if (Link.this.foot++ == index) {
                return this.data;
            }
            return this.next.getNote(index);
        }

        public boolean setNote(int index, Object obj) {
            if (Link.this.foot++ == index) {
                this.data = obj;
                return true;
            }
            return this.next.setNote(index, obj);
        }

        public boolean removeNote(Note up, Object obj) {
            if (this.data.equals(obj)) {
                up.next = this.next;
                Link.this.count--;
                return true;
            }
            return this.next.removeNote(this, obj);
        }

        public void toArray() {
            Link.this.array[Link.this.foot++] = this.data;
            if (this.next != null) {
                this.next.toArray();
            }
        }
    }

    //-------------------------以上为内部类--------------------------------
    private Note root;//记录表头数据
    private int count;//计数
    private int foot;//脚标,控制索引
    private Object[] array;//存储数组对象

    //增加
    public void add(Object obj) {
        if (obj == null)//看个人情况,我一般链表不需要存储空数据
        {
            return;
        }
        if (root == null)//表头数据是否为空
        {
            root = new Note(obj);
        } else//如果表头数据不为空,则将数据交给Note进行处理。占用合适的Next节点
        {
            root.addNote(obj);
        }
        this.count++;
    }

    //获取数量
    public int size() {
        return this.count;
    }

    //contains判断指定的数据是否存在
    public boolean contains(Object obj) {
        if (obj == null) {
            return false;
        }
        if (obj.equals(this.root.data))//如果和root数据相等的话直接返回
        {
            return true;
        }
        return this.root.containsNote(obj);//交由Note类处理next节点数据
    }

    //判断链表是否为空
    //true表示为空
    //false表示不为空
    public boolean isEmpty() {
        return root == null || this.count == 0;
    }

    //根据索引获取数据
    public Object get(int index) {
        if (index >= this.count) {
            return null;
        }
        this.foot = 0;
        return root.getNote(index);
    }

    //根据索引修改内容
    public boolean set(int index, Object obj) {
        if (index >= this.count) {
            return false;
        }
        this.foot = 0;
        return root.setNote(index, obj);
    }

    /**
     * 删除指定数据
     * 要删除的内容是next节点,因为root已经判断过了所以直接用root.next调用,
     * 删除本义就是将要删除的对象从链表中移除,
     * 例如链表1-2-3,’-‘代表next 假设我们要删除2 最终结果就是让1-3,也就是说让2的上一节点之间指向2的下一节点
     */
    public boolean remove(Object obj) {
        if (this.count == 0 || obj == null) {
            return false;
        }
        //删除分为两种情况
        //情况一:要删除的数据是root
        if (this.root.data.equals(obj)) {
            this.root = this.root.next;//将root内容指向下一个节点
            this.count--;
        }
        return this.root.next.removeNote(this.root, obj);
    }

    //将Link数据转换为数组
    public Object[] toArray() {
        if (isEmpty())//判断如果为空的话直接返回
        {
            return null;
        }
        this.foot = 0;//初始化脚标控制索引
        this.array = new Object[this.count];//初始化数组长度为链表数量
        this.root.toArray();//调用Note类处理
        return this.array;
    }
}

测试实例如下:

package myc.util;

import myc.java.util.Link;

import java.sql.SQLOutput;
import java.util.Arrays;

public class test {
    public static void main(String[] args) {
        Link link=new Link();
        link.add("aa");
        link.add("BB");
        link.add("cc");
        System.out.println("输出链表内容:"+Arrays.toString(link.toArray()));
        System.out.println("获取索引为0的数据:"+link.get(0));
        System.out.println("获取链表数量:"+link.size());
        System.out.println("判断SS在链表中是否存在:"+link.contains("SS"));
        link.set(1,"bb");//修改索引为1的数据内容为bb
        System.out.println("输出修改后的链表内容:"+Arrays.toString(link.toArray()));
        link.remove("cc");//删除cc数据
        System.out.println("输出删除cc内容后的链表:"+Arrays.toString(link.toArray()));
    }
}

运行结果如下:

输出链表内容:[aa, BB, cc]
获取索引为0的数据:aa
获取链表数量:3
判断SS在链表中是否存在:false
输出修改后的链表内容:[aa, bb, cc]
输出删除cc内容后的链表:[aa, bb]  

记录目前学习的内容,欢迎大家讨论~