1. 程式人生 > >linkedList手寫

linkedList手寫

package connection;

/**
 * linkedList底層實現
 * 採用連結串列儲存 雙向連結串列
 * 重要點 就有first節點 和last節點
 * first節點  查詢起始點,last節點插入刪除起始點(這樣就不要去遍歷整個連結串列了,但是隻對於那種在最末端插入刪除的情況)
 * first和last也是提高了一定的效率
 * 
 * @author 蔣子文
 *
 */

public class MyLinkedList {
    
    Entry first = new Entry();
    Entry last = new Entry();
    int size = 0;
    
    class Entry{
        Object data;
        Entry next; 
        Entry prev;
    }
    
    public void add(Object data) {
        if(this.size == 0) {
            //如果是第一個的話 做一下操作
            Entry entry = new Entry();
            entry.data = data;
            first = entry;
            last = entry;
            this.size++;
        }
        else {
            //不是第一個插入的話就直接插入就好了
            Entry entry = new Entry();
            entry.data = data;
            entry.prev = last;
            last.next = entry;
            last = entry;
            this.size++;
        }
    }
    //指定位置 新增元素
    public void add(int index , Object data) {
        Entry entry = new Entry();
        entry.data = data;
        if(!isData(index)) {
            entry = null;
            return;
        }
        /*
         * 當然這裡還是應該判斷一下是不是首尾位置
         */
        else if(index == 0){
            entry.next = first;
            first.prev = entry;
            first = entry;
            this.size++;
        }
        else if(index == this.size-1) {
            add(data); //直接呼叫方法新增
        }
        else {
            Entry oldEntry = new Entry();
            oldEntry = first;
            for(int i=0; i<=index-1 ; i++) {
                oldEntry = oldEntry.next;
            }
            //左邊連線起來
            oldEntry.prev.next = entry;
            entry.prev = oldEntry.prev;
            //右邊連線起來
            entry.next = oldEntry;
            oldEntry.prev = entry;
            this.size++;
        }
    }
    //通過下標去得到對應的值
    public Object get(int index) {
        //不合法下標返回null
        if(!isData(index)) {
            return null;
        }
        else {
            Entry entry = new Entry();
            entry = first;
            //迴圈找到位置
            for(int i=0; i<index-1; i++) {
                entry = entry.next;
            }
            return entry.data;
        }
    }
    
    //刪除最後一個元素
    public void remove() {
        //如果沒有元素
        if(this.size == 0) {
            return ;
        }
        //如果只有一個元素
        else if(this.size == 1) {
            first = null;
            last = null;
            this.size --;
        }
        else {
            last = last.prev;
            this.size --;
        }
    }
    
    //指定位置刪除元素
    public void remove(int index) {
        if (!isData(index)) {
            return;
        }
        //加一個判斷 是不是最後一個index 因為這不能直接刪 我們不能沒有last節點
        else if(index == this.size-1){
            //last就是最後一個元素的標記 只要把last節點向前移一個就可以
            System.out.println(this.size);
            last = last.prev;
            this.size --;
        }
        //加一個判斷  不能直接刪掉第一個元素
        else if(index == 0){
            //first是開始節點是標記 然後只要將first向後移一位
            first = first.next;
            this.size --;
        }else {
            Entry entry = first;
            for(int i=0; i<index; i++) {
                //System.out.println(i);
                entry = entry.next;
            }
            //這是重點 刪除中間節點
            entry.next.prev = entry.prev;
            entry.prev.next = entry.next;
            this.size --;
        }
    }
    
    public void print() {
        Entry entry = first;
        while(entry!=last.next) {
            System.out.println(entry.data);
            entry = entry.next;
        }
    }
    
    public boolean isData(int index) {
        return index < this.size && index >= 0;
    } 
    
    public static void main(String[] args) {
        MyLinkedList list = new MyLinkedList();
        list.add("123");
        list.add("456");
        list.add("789");
        list.add("000");
        list.add(1,"123");
        list.remove(3);
        System.out.println(list.get(2));
        list.print();
    }
}