模拟实现链表结构的增删改查的操作

public class MyLink<T> {
    //链表的长度
    private long length = 0;
    //链表的第一个值的位置
    private Node first = null;
    //链表的最后一个值的位置
    private Node last = null;
    //链表的值(内部类的模式) T代表值的类型
    private class Node<T>{
        //T类型的值data
        T data;
        //值的下一个位置
        Node next;
        //初始化的构造函数
        public Node(T data){
            this.data = data;
        }
    }
    //向链表中添加一个值,默认添加到末尾,添加成功返回true
    public boolean addLast(T data){//这里要使用内部类中的类型T,必须在主类上添加响应类型T
        if(length ==0||first == null){
            //代表链表一个元素都没有,可以直接添加
            first = new Node(data);
            last = first;
        }else{//代表链表中有值
            Node newNode = new Node(data);
            last.next = newNode;
            last = newNode;
        }
        length++;
        return true;
    }
    //在链表中删除一个值
    public boolean delete(T data){
        //当链表为空的,或者没有元素的时候,代表删除成功
        if(length==0||first==null){
            return true;
        }
        //查找元素
        Node n = first;
        //相当于n的父节点(上一级,因为删除一个元素后,上一级的下一个节点指向删除元素的下一个节点)
        Node parentNode = null;
        while(n!=null){
            //证明找到
            if(n.data==data||n.data.equals(data)){
                //如果是第一个元素是要删除的元素
                if(n==first){
                    first = first.next;    
                }else{
                    //n的上一个节点parentNode的下一个节点指向删除元素n的下一个节点
                    parentNode.next = n.next;
                }
                length--;
                return true;
            }
            //没有找到
            //先把父节点存储起来
            parentNode = n;
            //然后继续下一个节点进行查找
            n = n.next;
        }
        //当循环结束,还没有返回,代表这个链表中没有这个值,删除失败
        return false;
    }
    //查找这个元素是否在链表中存在
    public boolean seek(T data){
        if(first==null||length==0){
            return false;
        }
        Node n = first;
        while(n!=null){
            //证明找到
            if(n.data==data||n.data.equals(data)){
                return true;
            }
            n = n.next;
        }
        //当循环结束,代表超找结束,没找到这个元素
        return false;
    }
    //插入一个元素到指定元素的的后一位(可能有很多相同的元素,默认只插入到第一个元素的后面)
    //参数有两个,一个是需要插入的元素,一个是插入元素的值的位置
    public boolean insertAfter(T existsData,T insertData){
        if(existsData==null){
            return addLast(insertData);
        }
        Node n = first;
        while(n!=null){
            //证明找到
            if(n.data==existsData||n.data.equals(existsData)){
                Node right = n.next;
                Node newNode = new Node(insertData);
                n.next = newNode;
                newNode.next = right;
                length++;
                return true;
            }
            n = n.next;
        }
        //代表没有这个元素,无法插入
        return false;
    }
    
}

猜你喜欢

转载自blog.csdn.net/weixin_43888806/article/details/85927543