簡體   English   中英

通過鏈表中的索引刪除元素

[英]Removing an element by index in a linked list

已實現從鏈表中刪除元素的方法:

public void remove(T e) {
 
    Node<T> node = first;
    Node<T> prevNode = null;
    while(node != null){
        if(e.equals(node)){
            if(prevNode  == null) {
                first = node.next;
            }
            else {
                prevNode.next = node.next;
            }
            size--;
        }
        else {
            prevNode = node;
        }
        node = node.next;
    }
}

如何正確實現按索引刪除元素? 使用 remove 方法的功能。

public void removeByIndex(int i) {
    remove(i);
}
remove(get(i));

這不是最有效的解決方案,而是使用remove(T)方法的簡單解決方案。 您使用get(i)調用它作為要刪除的 object - 這是指定索引處的元素。

注意:如果列表具有重復值,此解決方案會出現一些問題,但在這種情況下,您無論如何都不應該使用remove(T)方法。 如果您希望它是安全的,請迭代到指定的索引:

    Node<T> node = first;       
    for(int i=0;i<index;i++){
        prevNode=node;
        node=node.next;
    }

並這樣做:

node.prev.next=node.next;
node.next.prev=node.prev;
size--;

當然,這只是一個粗略的實現。 為確保完全兼容,您應該檢查索引是否有效並使用 LinkedList 的unlink(Node)方法。

LinkedList 還有一個remove(int)方法的實現:

checkElementIndex(index);
return unlink(node(index));

像這樣的東西應該工作:

public void remove(int i) {
    if (i >= size || i < 0) {
        throw new ArrayIndexOutOfBoundsException();
    }
    Node<T> remove;
    if (i == 0) {
        remove = first;
        first = first.next;
        first.prev = null; // <- For double linked list
    } else {
        Node<T> node = first;
        for (int j = 0; j < i - 1; ++j) {
            node = node.next;
        }
        remove = node.next;
        if (i == size - 1) {
            node.next = null;
        } else {
            node.next.next.prev = node; // <- For double linked list
            node.next = node.next.next;
        }
    }
    // Clear links from removed Node
    remove.next = null;
    remove.prev = null; // <- For double linked list
    size--;
}

找到 position i 之前的節點。 將該節點指向“下一個”節點。

編輯原始代碼示例充其量只是一個粗略的草圖。 更新為更完整的版本。

編輯#2

輕微改進:

  • 清除已移除節點中的鏈接
  • 還處理雙鏈表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM