2017-06-18 13 views
1

Swiftを使用してLinkedListを実装しているコードを見ています。私はいくつかのことを明確にする必要があります。まず第一に、ここに私のLinkedListクラスの以下のコードであり、私の関数は、リストからノードを削除するには: Swiftを使用してリンクリストについての明確化が必要

public class Node<T> { 

    var value:T 
    var next: Node? 

} 

public class LinkedList<T:Equatable> { 

    private var head = Node<T>() 

    func remove(at index: Int) { 

     if ((index < 0 || (index > (self.count - 1)) || (head.value == nil)) { 
      print("link does not exist.") 
      return 
     } 

     var current: Node? = head 
     var previous: Node<T>? 
     var listIndex:Int = 0 

     if index == 0 { 
      current = current?.next 
      head = current! 
      return 
     } 

     while current != nil { 
      if listIndex == index { 
       previous!.next = current?.next 
       current = nil 
       break 
      } 

      previous = current 
      current = current?.next 
      listIndex += 1 
     } 
    } 
} 

それが次のコードブロックでは、リストからオブジェクトを削除することになる

 if index == 0 { 
      current = current?.next 
      head = current! 
      return 
     } 

上記のコードブロックに関する私の質問は、現在のポインタをリスト内の1つのノードに移動し、現在ポインタが指しているノードを指すようにヘッドポインタの参照を変更することです。しかし、元々current.nextを指していたノードにはどうなりますか?それへの参照はありませんが、ITはまだリストの2番目のノードへの参照を持っていますが、正しいですか?リスト内の次のノードへの参照がまだ残っている場合、このノードは完全にどのように削除されますか?私は、ノードがリストの途中で発見された場合、後に続くブロックで同じ質問があります:

if listIndex == index { 
     previous!.next = current?.next 
     current = nil 
     break 
    } 

ご注意:私は学校ではないですし、これは宿題ではありません。私は独自にアルゴリズムを研究していて、もともとJavaで学んだ概念をレビューし、それらをSwiftに適用します。

答えて

1

index == 0ブロックの実行後に元のheadへの参照がないことを修正しました。つまり、プログラムの残りの部分では、そのノードでは何もできません。ノードに割り当てられたメモリは、他のオブジェクトで使用できるように再利用する必要があります(そうしないと、メモリを無駄にしている完全に無駄なノードになります)。

スウィフトはautomatic reference countingを使用しているため、オブジェクトへの参照がないときに検出し、メモリを再要求します。あなたは何も特別なことをしなくても、記憶は再生されます。

リスト内の次のノードへの参照がまだ残っている場合、このノードは完全に削除されますか?

元のヘッドが別のノードへの参照を持っているという事実は、それがシステムによって再生されることを妨げません。プログラムは、他のノードを参照しているオブジェクトを照会することはできません。したがって、元のヘッドが再生された場合(余分なメモリが使用可能になっている場合を除き)、プログラムの残りの部分に違いはありません。

+0

ご清聴ありがとうございます。とても有難い! – syedfa

関連する問題