前のノードが次のノードを指すようにするだけですか。
prev.next = next;
return current;
またはノードを分離します
prev.next = next;
current.next = null;
return current;
削除されたノードがある場合は、次のポインターを使用して残りのリストをトラバースできます。双方向リンク リストではどうでしょうか。
前のノードが次のノードを指すようにするだけですか。
prev.next = next;
return current;
またはノードを分離します
prev.next = next;
current.next = null;
return current;
削除されたノードがある場合は、次のポインターを使用して残りのリストをトラバースできます。双方向リンク リストではどうでしょうか。
最も重要なことは、削除後もリストの不変条件がそのまま残ることです。あれは
リストの不変条件は、リストに属さないノードについては何も言わないのでcurrent.next = null
、削除中に設定するかどうかは実際には問題になりません。
そのままcurrent.next
にしておくと、不要になったオブジェクトへの参照が存在する可能性があるため、自動ガベージ コレクションが妨げられる可能性があります。しかし、これは正確な状況によって異なります。
自動ガベージ コレクションのない言語では、別のオブジェクトを所有するという概念が存在します。別のオブジェクトを所有するオブジェクトは、その別のオブジェクトのリソース (たとえば、別のオブジェクトが占有するメモリ) を管理する責任があります。所有オブジェクトが削除されると、所有者は所有オブジェクトを削除する必要があります。このような場合、current.next = null
削除する前にを設定しないcurrent
と、削除されるべきではない他のオブジェクトが削除されます。
ノードを「分離」する本当の理由はありません。前のノードの次のポインターを次のノードに設定すると、現在のノードがリスト ヘッドから見つからないという意味で「分離」されます。自動ガベージ コレクションがない場合は、それを削除する必要があります。
二重にリンクされたリストを操作する場合、current.next の以前のポインターも更新する必要があります。古い現在のノードを指すすべてのノード ポインターを置き換えたら、リストからの接合が完了し、もはや見つけられなくなります。
この例では、一重リンク リストと二重リンク リストの両方から 'b' ノードを削除しています。括弧内の矢印は、更新する必要があるものです。
[a] (->) [b] -> [c] would become [a] -> [c]
[a] <(->) [b] (<-)> [c] would become [a] <-> [c]