JAVA实现单链表

public class SingleLinkedList<E> {
    //链表头节点指针区
    private Node head;
    //链表头节点数据区
    private Object data;
    //记录链表节点个数
    private int count;

    public void remove(E e){
        //null 要单独使用==判断
        if (e==null){
            //头结点指针区为null,只有一个元素,直接赋值为null交给GC处理
            if (head.next==null){
                head.data=null;
            }else {
                //至少存在两个以上元素,定义变量保存当前遍历的节点,从头结点遍历
                Node tempNode=head;
                //定义变量记录上一节点,头结点非空,至少从第二个以后的节点才出现数据区为null
                Node preNode=head;
                //当前遍历节点数据区不为null
                while (tempNode.data!=null){
                    //记录当前节点
                    preNode=tempNode;
                    //更新遍历的节点信息为下一节点
                    tempNode= tempNode.next;
                }
                //找到了数据区为null的节点保存在tempNode中,且上一节点保存在preNode中
                //将上一节点指针区信息更新为找到的节点的指针区信息,即让上一节点取代当前数据区为null节点的位置指向后面的节点
                preNode.next=tempNode.next;
                //将数据区为null的节点中指针区设为null,交给GC处理
                tempNode.next=null;
            }
            //更新链表个数
            count--;
        }else {
            if (e.equals(head.data)){
                head.data=null;
            }else {
                //至少存在两个以上元素,定义变量保存当前遍历的节点,从头结点遍历
                Node tempNode=head;
                //定义变量记录上一节点,头结点非空,至少从第二个以后的节点才出现数据区为 e 的节点
                Node preNode=head;
                //当前遍历节点数据区不为 e
                while (!e.equals(tempNode.data)){
                    //记录当前节点
                    preNode=tempNode;
                    //更新遍历的节点信息为下一节点
                    tempNode= tempNode.next;
                }
                //找到了数据区为 e 的节点保存在tempNode中,且上一节点保存在preNode中
                //将上一节点指针区信息更新为找到的节点的指针区信息,即让上一节点取代当前数据区为 e 节点的位置指向后面的节点
                preNode.next=tempNode.next;
                //将数据区为 e 的节点中指针区设为null,交给GC处理
                tempNode.next=null;
            }
            //更新链表个数
            count--;
        }
    }

    //链表add方法
    public void add(E e) {
        //先创建一个新节点保存数据
        Node newNode = new Node(e, null);
        if (head == null) {
            head = newNode;
        } else {
            //临时保存节点信息
            Node tempNode = head;
            while (tempNode.next != null) {
                //更新节点信息,指向下一节点
                tempNode = tempNode.next;
            }
            tempNode.next = newNode;
        }
        count++;
    }

    public int size() {
        return count;
    }

    @Override
    public String toString() {
        Object[] obj = new Object[count];
        Node tempNode = head;
        for (int j = 0; j < count; j++) {
            obj[j] = tempNode.data;
            tempNode = tempNode.next;
        }
        return Arrays.toString(obj);
    }

    //链表节点
    private class Node {
        //数据存储区
        private Object data;
        //指针区
        private Node next;

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

}

这里只实现了增加和删除的方法,可以基于remove方法增加一个set方法,用来修改链表的值。

上一篇:LeetCode刷题(16)【简单】移除链表元素&&回文链表&&删除链表中的结点


下一篇:Spring Boot实践,开发社区核心功能