連結串列 - 單向連結串列

weixin_33924312發表於2019-02-25

單向連結串列包含多個節點,且每個節點都有一個指向後繼元素的next指標。連結串列中的最後一個節點的next指標值為null,表示該連結串列結束。

單向連結串列的實現

/**
 * 連結串列的型別宣告
 * 以int型別為例
 */
public class ListLinkNode {

    public int data;

    public ListLinkNode next;

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

    @Override
    public String toString() {
        return data + "";
    }
}

連結串列的操作

  • 遍歷連結串列
  • 在連結串列中插入一個元素
  • 在連結串列中刪除一個元素

1 - 遍歷連結串列

程式碼:

/**
 * 連結串列的長度
 * 時間複雜度:O(n)
 * 空間複雜度:O(1) :近用於建立臨時變數
 * @return 連結串列的長度
 */
public int length() {
    int size = 0;
    ListLinkNode temp = first;
    while (temp != null) {
        size++;
        temp = temp.next;
    }
    return size;
}

思路:

沿著指標遍歷
遍歷時計數
當next指標的值為NULL時結束遍歷

2 - 在連結串列中插入一個元素

程式碼:

/**
 * 時間複雜度:O(n)
 * 空間複雜度:O(1):近用於建立臨時變數
 *
 * @param index 從0開始
 * @param node  要插入的節點
 * @return 插入失敗則返回null
 * 插入成功則返回連結串列的頭結點
 * <p>
 * 邊界:
 * 空連結串列,插入位置 = 0 則插入成功且返回插入節點
 * 空連結串列,插入位置 非0 則插入失敗且返回null
 */
public ListLinkNode insertLinked(int index, ListLinkNode node) {
    //當連結串列為空時
    if (first == null) {
        if (index == 0) {
            first = node;
            last = node;
            return first;
        } else {
            return null;
        }
    }
    //位置資訊不合法,則返回null
    if (index > length()) {
        return null;
    }
    //插入到頭結點
    if (index == 0) {
        node.next = first;
        first = node;
        return node;
    } else {
        int i = 1;
        ListLinkNode temp = first;
        while (temp != null) {
            if (i == index) {
                ListLinkNode save = temp.next;
                temp.next = node;
                node.next = save;
                if (save == null) {
                    last = node;
                }
                return node;
            }
            i++;
            temp = temp.next;
        }
    }
    return null;
}

思路:

當連結串列為空連結串列時插入操作
插入連結串列頭
插入除連結串列頭外的其他位置

3 - 在連結串列中刪除一個元素

程式碼:

/**
 * 時間複雜度:O(n)
 * 空間複雜度:O(1):近用於建立臨時變數
 *
 * @param index 以0開始
 * @return 刪除失敗則返回null
 * 刪除成功則返回被刪除的節點
 * 刪除失敗則返回null
 */
public ListLinkNode deleteNode(int index) {
    //當時空連結串列時刪除操作
    if (first == null) {
        return null;
    }
    //當刪除的位置資訊不合法時
    if (index >= length()) {
        return null;
    }
    //當刪除的是連結串列頭時
    if (index == 0) {
        ListLinkNode temp = first;
        first = first.next;
        return temp;
    } else {
        int i = 0;
        ListLinkNode temp = first;
        ListLinkNode before = null;
        while (temp != null) {
            if (i == index) {
                before.next = temp.next;
                return temp;
            } else {
                before = temp;
            }
            i++;
            temp = temp.next;
        }
        //若是index不合法的話last則是null;
        last = null;
    }
    return null;
}

思路:

刪除空連結串列
刪除連結串列頭
刪除連結串列頭以外的節點

4 - 獲取連結串列中第 index 個節點的值。如果索引無效,則返回-1。

程式碼:

/**
 * 獲取連結串列中第 index 個節點的值。如果索引無效,則返回-1。
 *
 * @param index
 * @return
 */
public int getValueByIndex(int index) {
    if (index >= length() || isEmpty()) {
        return -1;
    }
    if (index == 0) {
        return first.data;
    } else {
        int i = 0;
        ListLinkNode temp = first;
        while (temp != null) {
            if (i == index) {
                return temp.data;
            }
            i++;
            temp = temp.next;
        }
        return -1;
    }
}

相關文章