1. 程式人生 > >LinkedList與ArrayList的異同

LinkedList與ArrayList的異同

        LinkedList是一個底層為連結串列的類,LinkedList繼承AbstractSequentialList,與ArrayList一樣實現AbstractList介面。LinkedList類具有 size(資料個數),node:prio (前驅),node:next(後繼)三個特殊的屬性。

        與ArrayList一樣,LinkedList有add,remove,get等方法,我們可以直接來使用。下面我們來完成一個簡單的LinedList(雙向連結串列),完成add,remove,get方法:

class LinkedList {

    class Node {
        int data;
        Node prio;
        Node next;

        public Node() {
            this.data = -1;
            this.next = null;
            this.prio = null;
        }

        public Node(int data) {
            this.data = data;
            this.next = null;
            this.prio = null;
        }
    }

    private Node head = null;

    public LinkedList () {
        this.head = new Node();
    }


    /**
     * 頭插法
     */
    public void add(int val) {
        Node node = new Node(val);
        node.next=this.head.next;
        node.prio=this.head;
        this.head.next=node;
        if (node.next != null){  //第一次插入節點的時候
            node.next.prio=node;
        }
    }

    /**
     * 刪除所有值為val的節點
     */
    public void remove(int val){
        Node cur =this.head.next;
        while (cur.next !=null){
            if (cur.data == val){
                cur.prio.next=cur.next;
                if (cur.next != null) {
                    cur.next.prio = cur.prio;
                }
            }
            cur=cur.next;
        }
    }

    /**
     * 列印函式
     */
    public void show(){
        Node cur = this.head.next;
        while (cur != null){
            System.out.print(" "+cur.data);
            cur=cur.next;
        }
        System.out.println();
    }
}
public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList linkedlist= new LinkedList();
        LinkedList .add(10);
        LinkedList .add(20);
        LinkedList .add(30);
        LinkedList .show();
    }
}

列印結果:

C:\java\java7\jdk1.7.0_80\bin\java.exe -javaagent:D:\ideaIU-
 30 20 10

Process finished with exit code 0

 

ArrayList和LinkedList在效能上各 有優缺點,都有各自所適用的地方,總的說來可以描述如下: 
1.對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對 ArrayList而言,主要是在內部陣列中增加一項,指向所新增的元素,偶爾可能會導致對陣列重新進行分配;而對LinkedList而言,這個開銷是 統一的,分配一個內部Node物件。
2.在ArrayList的 中間插入或刪除一個元素意味著這個列表中剩餘的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
3.LinkedList不 支援高效的隨機元素訪問。
4.ArrayList的空 間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間

 

 

實現一個簡單的LinkedList的Iterator:

import java.util.Iterator;

/**
 * 描述:LinkedList的Iterator的實現
 * @Author administrator{GINO ZHANG}
 * @Date2018/10/16
 */
public class MyLinkedList implements Iterable{
    class Node {
        private int data;
        private Node next;


        public Node(int data, Node next) {
            super();
            this.data = data;
            this.next = next;
        }

        public Object getData() {
            return data;
        }

        public void setData(int data) {
            this.data = data;
        }

        public Node getNext() {
            return next;
        }

        public void setNext(Node next) {
            this.next = next;
        }

    }

    Node head=null;//頭節點(以後的元素通過next得到)
    Node tail=null;//尾節點
    int size=0;

    /**
     * 尾插
     * @param val
     * @return
     */
    public boolean add(int val){
        Node node=new Node(val,null);
        if(head == null){
            head=node;
            tail=node;
        }
        tail.setNext(node);
        tail=node;
        size++;

        return false;
    }

    public int size(){
        return size;
    }

    @Override
    public Iterator iterator(){
        return new MyIterator();
    }

    class MyIterator implements Iterator{
        private Node node=head;//節點


        @Override
        public boolean hasNext() {
            if(node.getNext()==null) return false;
            else return true;
        }


        @Override
        public Object next() {
            Object o=node.getNext().getData();
            node=node.getNext();
            return o;
        }
    }
}