Java 自定義實現鏈表


自定義實現鏈表很簡單,只需要明白鏈表是什么樣子的數據結構。

下圖表示一種單向列表。其中指針first指向隊頭,last指向隊尾,curr指向當前讀的數據。

下面是我的實現代碼,很簡單,明白上述結構后,關鍵是構造一個內部類,里面包含一個指向下一個元素的對象(指向下一個元素的指針)

public class MyLinkedList<T>{

    /**
     * 指向list中最后一個元素
     */
    Node<T> last;
    
    /**
     * 指向list中第一個元素
     */
    Node<T> first;
    
    /**
     * 指向當前讀取的元素
     */
    Node<T> currRead;

    private int size ;

    /**
     * <默認構造函數>
     */
    public MyLinkedList(){
        size = 0;
        last = new Node(null,-1);
        first = last;
        currRead = first;
    }

    /**
     * 往鏈表中添加數據(隊尾添加數據)
     * <功能詳細描述>
     * @param element
     * @return
     * @see [類、類#方法、類#成員]
     */
    public T add(T element){
        Node<T> newNode = new Node<T>(null,element);
        last.next = newNode;
        last = newNode;
        if(size == 0){
            first = newNode;
        }
        size ++;
        return element;
    }

    /**
     * 移除鏈表中的數據(隊頭移除)
     * <功能詳細描述>
     * @return
     * @see [類、類#方法、類#成員]
     */
    public T remove(){
        if(size == 0){
            System.out.println("empty list ");
            currRead = first;
            return null;
        }
        T result = first.element;
        first = first.next;
        currRead = first;
        size--;
        return result;
    }

    /**
     * 獲取隊列中的元素
     * <功能詳細描述>
     * @return
     * @see [類、類#方法、類#成員]
     */
    public T get(){
        if(currRead.next == null){
            setReadAgain();
            return currRead.element;
        }
        T result = currRead.element;
        currRead = currRead.next;
        return result;
    }

    /**
     * 再次從頭開始讀取數據
     * <功能詳細描述>
     * @see [類、類#方法、類#成員]
     */
    public void setReadAgain() {
        currRead = first;
    }

    public String toString(){
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<size;i++){
           T ele = get();
           sb.append(currRead.element + "-->");
        }
        return sb.toString();
    }

    /**
     * 獲取隊列大小
     * <功能詳細描述>
     * @return
     * @see [類、類#方法、類#成員]
     */
    public int getSize(){
        return this.size;
    }

    class Node<T> {
        Node<T> next;
        T element;
        public Node( Node<T> next, T element){
            this.next = next;
            this.element = element;
        }
    }

 

實踐一下,看能不能使用

public class Test {
    public static void main(String[] args){

        MyLinkedList linkedList = new MyLinkedList();
        System.out.println("-------start-------");
        System.out.println(linkedList.toString());
        for (int i=0;i<5;i++){
            linkedList.add(i+1);
        }
        System.out.println(linkedList.toString());
        for(int i=0;i<5;i++){
            System.out.println(linkedList.remove());
        }

        System.out.println(linkedList.toString());
        System.out.println("-------end-------");
    }

 

下面是結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM