單鏈表的實現

單鏈表也是最基本的一個數據類型,相對比較簡單。
如果有任何疑問歡迎來探討。

首先是節點數據

package ListExercise;

public class Node<T> {
    // 下一個節點
    public Node<T> next;
    // 任意數據類型
    public T data;

    // 初始化數據
    public Node(T t) {
        this.data = t;
        next = null;
    }
}

接下來是我們的核心代碼

package ListExercise;

public class LinkedList<T> {

    // 頭結點
    private Node<T> headNode;
    // 鏈表長度
    private int size;

    // -1是頭節點,沒有數據
    public LinkedList() {
        size = 0;
        headNode = new Node<T>(null);
    }

    // 添加元素data
    public boolean add(T data) {
        boolean ret = false;
        Node<T> node = getHide(this.size - 1);
        node.next = new Node<T>(data);

        size++;
        ret = true;
        return ret;
    }

    // 添加元素data
    public boolean insert(int index, T data) {
        boolean ret = false;
        Node<T> node = getHide(index - 1);
        Node<T> nextNode = node.next;
        node.next = new Node<T>(data);
        node.next.next = nextNode;

        size++;
        ret = true;
        return ret;
    }

    // 刪除元素data
    public boolean remove(T data) {
        boolean ret = false;
        Node<T> a = headNode;
        while (a.next != null) {
            if (a.next.data == data) {
                a.next = a.next.next;
                ret = true;
                break;
            }
            a = a.next;
        }
        size--;
        return ret;
    }

    // 刪除元素data
    public boolean removeAt(int index) {
        boolean ret = false;
        if (index >= 0 && index < size) {
            Node<T> a = headNode;
            int i = -1;
            while (i < index - 1) {
                a = a.next;
                i++;
            }
            size--;
            a.next = a.next.next;
        } else {
            throw new RuntimeException("超出數據范圍:" + index);
        }

        return ret;
    }

    // -1是頭節點,沒有數據
    public Node<T> get(int index) {
        if (index < 0 || index >= size) {
            throw new RuntimeException("超出數據范圍:" + index);
        }

        return getHide(index);
    }

    // -1是頭節點,沒有數據
    private Node<T> getHide(int index) {
        int i = -1;
        Node<T> ret = headNode;
        while (i < index) {
            ret = ret.next;
            i++;
        }
        return ret;
    }

    public void print() {
        Node<T> t = headNode;
        int i = 0;
        while (t.next != null) {
            t = t.next;
            System.err.println(t.data);
            i++;
            if (i > 100)
                break;
        }
        System.err.println("長度為:" + i);
    }
}


最后是測試的代碼:

package ListExercise;

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

        LinkedList<Integer> linkedList = new LinkedList<Integer>();
        for (int i = 0; i < 10; i++) {
            linkedList.add(i);
        }

        linkedList.print();
        linkedList.insert(10,10);
        linkedList.remove(1);
        linkedList.removeAt(0);

        linkedList.print();
    }
}

最后,雙向鏈表和循環鏈表和單鏈表基本差不多就不一一舉例了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容