Java数据结构:链表

导读:
结构示意图如下
image
image

public class listNode<T> {
    public T date; //数据域
    public listNode next = null; //指针域
    public int size = 0; //链表大小
    public listNode head = this; //头指针
    public listNode addP = this; //用作添加节点的指针

    public listNode() {
    }

    public listNode(T date) {
        this.date = date;
    }

    public void add(T date) {
        addP.next = new listNode<T>(date);
        addP = addP.next;
        this.size++;
    }

    public void selectByIndex(int index) {
        listNode headT = this;
        for (int i = 0; i <= index; i++) {
            headT = headT.next;
        }
        System.out.println(headT.date);
    }

    public void delectByIndex(int index) {
        listNode headT = this;
        for (int i = 0; i < index - 1; i++) {
            headT = head.next;
        }

        /*
         * 这里是对指定下标的节点去掉唯一的引用,这样这个节点就会被GC清理掉(Java中一个没有任何引用关系的实例对象超过了它的作用域就会被GC回收清理掉)
         * 但是这里的所有添加的节点都是这个头节点创建的,所以只要这个头节点没有被销毁其他的失去引用关系的节点也会因为没有超出作用域而不被回收销毁。
         * 所以这个时候手动GC垃圾回收就很重要。这也是GC调优的一个用用场景
         * 参考文章:http://c.biancheng.net/view/959.html
         */

        //所以这里只是去掉唯一引用,没有超出节点的作用范围,所以应该还要手动GC清理删除掉的节点对象
//        head.next = null;
        headT.next = headT.next.next;

        //todo 手动GC掉被删除节点对象


        size--;
    }


}

public class listNodeT {
    public static void main(String[] args) {
        listNode<Integer> ListNode = new listNode<Integer>(0);
        ListNode.add(1);
        ListNode.add(2);
        ListNode.add(3);
//        ListNode.selectByIndex(0);
        ListNode.selectByIndex(1);
        
        ListNode.delectByIndex(1);
        ListNode.selectByIndex(1);
        
        System.out.println(ListNode.size);
        
        
    }
}

运行结果:
image

参考文章:力扣图解算法数据结构 https://leetcode.cn/leetbook/read/illustration-of-algorithm/50e446/

posted @ 2022-10-18 21:11  Little_Monster-lhq  阅读(18)  评论(0编辑  收藏  举报