双方向リンク リストの remove メソッドとは何ですか?
6 に答える
トカゲのビルが言ったのと同じアルゴリズムですが、グラフィカルな方法で:-)
(出典:jaffasoft.co.uk)
一般的なアルゴリズムは次のとおりです。
- 削除するノードを見つけます。
- node.previous.next = node.next
- node.next.previous = node.previous
- node.previous = null
- node.next = null
- GC 以外の環境にいる場合は、ノードを破棄します
前のノードと次のノードの null をチェックして、頭または尾を削除しているかどうかを確認する必要がありますが、これらは簡単なケースです。
public void remove ()
{
if (getPreviousNode () != null)
getPreviousNode ().setNextNode (getNextNode ());
if (getNextNode () != null)
getNextNode ().setPreviousNode (getPreviousNode ());
}
二重にリンクされたリストの実装 メソッドの削除 (私の 2 番目のプログラミング割り当てから):
public void remove(int index) {
if(index<0 || index>size())
throw new IndexOutOfBoundsException("Index out of bounds. Can't remove a node. No node exists at the specified index");
if(size()==0) {
throw new NullPointerException("Empty list");
}
if(!isEmpty()) {
Node current;
//starting next one to our head
current = head.next;
for(int i=0;i<index;i++) {
current = current.next;
}
current.previous.next = current.next;
current.next.previous = current.previous;
numOfNodes--;
sizeChangeCount++;
}
}
public boolean remove(T o) {
Node current = head;
for(int i=0;i<size();i++) {
current=current.next;
if(current.data.equals(o)) {
current.previous.next = current.next;
current.next.previous = current.previous;
numOfNodes--;
sizeChangeCount++;
return true;
}
}
return false;
}
API のメソッドの名前を尋ねていますか? 実際には二重リンクリストである java.util.LinkedList について尋ねていると仮定すると、その答えは単純に削除されます。
...または、そのタイプのデータ構造から要素を削除するアルゴリズムの名前が何と呼ばれているかについて質問していますか? まあ..その答えは、要素を削除することでもあります。実際のアルゴリズムでそれを行うには...前のノードの次のポインターと次のノードの最後のポインターを変更するだけです。ただし、複数のスレッドからデータ構造を使用している場合は、remove メソッドを同期するか、データ構造の使用パターンに適した順序で削除手順を実行する必要があります。
現在のポインターポインターはどうですか?crnt を次のノードに移動する必要があります。 http://pastebin.ca/1249635