[英]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.