LinkedList手工實現2

比上一個版本新增了add(int index, E element)方法,使用了泛型

/**
 * 新增泛型
 * remove方法
 * add方法(Obgect object)
 * get方法
 * getNode(int index)方法
 * 新增往指定位置插入方法add(int index,E element)
 * @author HQ
 * @e-mail [email protected]
 * @date 2018/11/2.
 */
public class LinkedList03<E> {

    private Node first;
    private Node last;
    private int size;

    public void remove(int index) {
        Node temp = getNode(index);
        if (temp != null) {
            Node up = temp.previous;
            Node down = temp.next;
            if (up != null) {
                up.next = down;
            }
            if (down != null) {
                down.previous = up;
            }

            //被刪除的元素是第一個元素時
            if(index==0){
                first=down;
            }
            //被刪除的元素是最後一個元素時
            if(index==size-1){
                last=up;
            }
            size--;
        }
    }


    public void add(int index,E element){

        checkRange(index);
        Node newNode=new Node(element);
        Node temp=getNode(index);
        if(temp!=null){
            Node up=temp.previous;

            up.next=newNode;
            newNode.previous=up;

            newNode.next=temp;
            temp.previous=newNode;
        }
        size++;
    }
    // [ ]
    //["a","b"]
    public void add(E object) {
        Node node = new Node(object);

        if (first == null) {

            node.previous = null;
            node.next = null;

            first = node;
            last = node;
        } else {
            node.previous = last;
            node.next = null;

            last.next = node;
            last = node;
        }
        size++;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder("[");


        Node temp = first;
        while (temp != null) {
            stringBuilder.append(temp.element + ",");
            temp = temp.next;
        }
        stringBuilder.setCharAt(stringBuilder.length() - 1, ']');

        return stringBuilder.toString();
    }

    public void checkRange(int index){
        if (index < 0 || index > size - 1) {
            throw new RuntimeException("索引位置不合法" + index);
        }
    }
    public E get(int index) {
        checkRange(index);
        Node temp = getNode(index);
        return temp != null ? (E)temp.element : null;

    }

    private Node getNode(int index) {
        checkRange(index);
        Node temp = null;
        //size>>1 相當於除以2
        if (index < (size >> 1)) {
            temp = first;
            for (int i = 0; i < index; i++) {
                temp = temp.next;
            }

        } else {
            temp = last;
            for (int i = size - 1; i > index; i--) {
                temp = temp.previous;

            }
        }
        return temp;

    }

    public static void main(String[] args) {
        LinkedList03<String> list01 = new LinkedList03();

        list01.add("a");
        list01.add("b");
        list01.add("c");
        list01.add("d");
        list01.add("e");
        list01.add("f");
        list01.add(3,"黃強");
        System.out.println(list01);
        System.out.println(list01.get(3));
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章