LinkedList簡單實現

package com.yys.student;

/**
 * Created by yys on 2017/5/6.
 */
public class SxtLinkedList {
    private Node first;//第一個對象
    private Node last;//第二第三第...個對象
    private int size;//list大小
    /**
     * add(Object object)鏈表中添加一個對象
     * 先判斷第一個對象是否爲空
     * 如果是第一個對象爲空 添加到此節點
     * 第一次添加時雙向鏈表的前一個指針指向是空 後一個指針指向也是空
     * 是第一個元素也是最後一個元素 但元素本身不爲空 圖解爲(null,object,null)
     * else
     * 如果不是第一次添加 即代表第一個已有值然後不斷向後添加
     * 假設此時往第二個位置添加
     * 鏈表第二個的前一個指針位置應該是fist 圖解爲(null,object,first)(first,object,null)
     */
    public void add(Object object){
        Node node = new Node();
        if(first==null){
            node.setPrevious(null);
            node.setObj(object);
            node.setNext(null);
            first = node;
            last = node;
        }else{
            node.setPrevious(last);
            node.setObj(object);
            node.setNext(null);
            last.setNext(node);
            last = node;
        }
        size++;
    }
    /**
     * get(int index)查找一個對象
     * 先判斷下標是否越界
     * 先判斷第一個對象是否爲空
     * 如果是第一個對象不爲空 從此處遍歷查詢
     */
    public Object get(int index){
        rangeCheck(index);
        Node temp = null;
        if(first!=null){
            temp = first;
            for(int i=0;i<index;i++){
                temp = temp.next;
            }
        }
        return temp.obj;
    }
    /**
     * get(int index)移除一個對象
     * 先判斷下標是否越界
     * 獲取下標位置節點 後取出此節點的上一個節點 和下一個節點
     *刪除此節點就是將上一節點的尾鏈指向下一節點 下一節點首鏈向上一節點
     * 下標--
     */
    public void remove(int index){
        rangeCheck(index);
        Node temp = node(index);
        if(temp != null){
            Node up = temp.previous;
            Node down = temp.next;
            up.next = down;
            down.previous = up;
        }
        size--;
    }
    /**
     * add(int index,Object obj)指定位置添加一個對象
     * 先獲取下標位置節點
     * new 一個新節點
     * 判斷獲取下標位置節點是否爲空
     * 如果不爲空 取出下標位置的上一節點 修改上一節點 (此時上一節點的下一節點是新加入節點) (新加入節點的上一節點是取出的上一節點)
     *新節點下一節點爲取出的下標節點 下標節點的上一節點是新加入節點
     * 下標--
     */
    public void add(int index,Object obj){
        Node temp = node(index);
        Node newNode = new Node();
        newNode.obj = obj;
        if(temp != null){
            Node up = temp.previous;
            up.next = newNode;
            newNode.previous = up;

            newNode.next = temp;
            temp.previous = newNode;
            size++;
        }
    }
    public Node node(int index){
        Node temp = null;
        if(first!=null){
            temp = first;
            for(int i=0;i<index;i++){
                temp = temp.next;
            }
            if(temp != null){
                return temp;
            }
        }
        return  null;
    }
    public int size(){
        return size;
    }
    /**
     * 檢驗數組下標是否越界
     */
    private void rangeCheck(int index){
        if(index<0 || index>=size){
            try {
                throw new Exception("下標越界");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String args[]){
        SxtLinkedList list = new SxtLinkedList();
        list.add("aaa");
        list.add("bbb");
        list.add(1,"BBB");
        list.add("ccc");
//        list.remove(1);
        System.out.println(list.get(1));
    }
}

class Node{
     Node previous;//上一個節點
     Object obj;
     Node next;//下一個節點

    public Node() {
    }

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

    public Node getPrevious() {
        return previous;
    }

    public void setPrevious(Node previous) {
        this.previous = previous;
    }

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}
發佈了45 篇原創文章 · 獲贊 36 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章