0

前のノードが次のノードを指すようにするだけですか。

prev.next = next;
return current;

またはノードを分離します

prev.next = next;
current.next = null;
return current;    

削除されたノードがある場合は、次のポインターを使用して残りのリストをトラバースできます。双方向リンク リストではどうでしょうか。

4

2 に答える 2

1

理論的には

最も重要なことは、削除後もリストの不変条件がそのまま残ることです。あれは

  • 円はありません。
  • 各ノードは次のノードを指します (そのノードが最後のノードでない限り)。
  • 二重連結リストでは、各ノードはその先行ノードの後続ノードです (ノードが最初のノードでない場合)。
  • 二重にリンクされたリストでは、各ノードは後続ノードの先行ノードです (ノードが最後のノードでない限り)。

リストの不変条件は、リストに属さないノードについては何も言わないのでcurrent.next = null、削除中に設定するかどうかは実際には問題になりません。

実際に

そのままcurrent.nextにしておくと、不要になったオブジェクトへの参照が存在する可能性があるため、自動ガベージ コレクションが妨げられる可能性があります。しかし、これは正確な状況によって異なります。

自動ガベージ コレクションのない言語では、別のオブジェクトを所有するという概念が存在します。別のオブジェクトを所有するオブジェクトは、その別のオブジェクトのリソース (たとえば、別のオブジェクトが占有するメモリ) を管理する責任があります。所有オブジェクトが削除されると、所有者は所有オブジェクトを削除する必要があります。このような場合、current.next = null削除する前にを設定しないcurrentと、削除されるべきではない他のオブジェクトが削除されます。

于 2013-10-20T08:45:11.650 に答える
0

ノードを「分離」する本当の理由はありません。前のノードの次のポインターを次のノードに設定すると、現在のノードがリスト ヘッドから見つからないという意味で「分離」されます。自動ガベージ コレクションがない場合は、それを削除する必要があります。

二重にリンクされたリストを操作する場合、current.next の以前のポインターも更新する必要があります。古い現在のノードを指すすべてのノード ポインターを置き換えたら、リストからの接合が完了し、もはや見つけられなくなります。

この例では、一重リンク リストと二重リンク リストの両方から 'b' ノードを削除しています。括弧内の矢印は、更新する必要があるものです。

   [a] (->) [b] -> [c]    would become    [a] -> [c]

[a] <(->) [b] (<-)> [c]   would become   [a] <-> [c]
于 2013-10-20T08:46:17.533 に答える