1. 程式人生 > >模擬實現連結串列結構的增刪改查的操作

模擬實現連結串列結構的增刪改查的操作

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;
    }
    
}