天天看點

LinkedList的實作

package com.wen.imitateArrayListAndLinkedList;

public class MyLinkedList<T> {

    private Node root;

    private Node tail;

    private Integer size = 0;

    public void add(T value){

        if(isValidValue(value)){

            Node newNode = new Node(tail, null, value);

            //如果連結清單沒有節點

            if(root==null){

                root = newNode;

            }else{

                //連結清單有節點,将新節點當成尾節點

                tail.next = newNode;

            }

            tail = newNode;

            size++;

        }

    }

    public void insertAt(T value,int index){

        if(isValidValue(value) && isValidIndex(index)){

            //拿到目标節點

            Node node = root;

            for (int i = 0; i < index; i++) {

                node = node.next;

            }

            //建立新節點

            Node newNode = new Node(node.prev, node, value);

            //插入節點

            //1.如果是插入到首節點

            if(node==root){

                root = newNode;

            }else{

                //2.插入到中間節點

                node.prev.next = newNode;

            }

            size++;

        }

    }

    public boolean removeNode(T value){

        if(isValidValue(value)){

            Node node = root;

            for (int i = 0; i < size; i++) {

                T val = node.value;

                if(val.equals(value)){

                    return remove(node);

                }

                node = node.next;

            }

        }

        return false;

    }

    public boolean removeFirst(){

        Node node = root;

        if(node!=null){

            return remove(node);

        }

        return false;

    }

    public boolean removeLast(){

        Node node = tail;

        if(node!=null){

            return remove(node);

        }

        return false;

    }

    private boolean remove(Node node) {

        //移除首節點

        if(node.prev==null){

            root = node.next;

        }else if(node.next==null){

            //移除尾節點

            tail = node.prev;

        }else{

            //移除中間節點

            node.prev.next = node.next;

        }

        node = null;

        size--;

        return true;

    }

    private boolean isValidIndex(int index) {

        if(index>=0 && index < size){

            return true;

        }

        throw new IllegalArgumentException("索引越界: "+index);

    }

    private boolean isValidValue(T value) {

        if(value!=null){

            return true;

        }

        throw new IllegalArgumentException("值不能 為null: "+value);

    }

    public void print() {

        StringBuilder sb = new StringBuilder(2 * size + 1);

        sb.append("{");

        if(size>0){

            Node node = root;

            for (int i = 0; i < size; i++) {

                sb.append(node.value);

                if(i!=size-1){

                    sb.append(",");

                }

                node = node.next;

            }            

        }

        sb.append("}");

        System.out.println(sb.toString());

    }

    // 建立節點類

    private class Node {

        Node prev;

        Node next;

        T value;

        public Node(Node prev, Node next, T value) {

            super();

            this.prev = prev;

            this.next = next;

            this.value = value;

        }

    }

}