2017-06-18 78 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 
     } 

與上述代碼塊有關的問題是,我意識到我將當前指針向下移動到列表中的一個節點上,然後將頭指針的引用更改爲指向當前指向的節點但是,最初指向current.next的節點會發生什麼?沒有提及它,但IT仍然對列表中的第二個節點有參考,是正確的?如果這個節點仍然有一個對列表中下一個節點的引用,它是如何完全刪除的?我有以下塊同樣的問題以後,當節點列表中的中間發現:

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

請注意:我不是在學校,這不是功課。我正在學習算法,回顧我最初在Java中學到的概念,並將它們應用到Swift中。

回答

1

您糾正index == 0塊執行後,將不會引用原始的head。這意味着對於程序的其餘部分,您無法對該節點執行任何操作。最好爲節點分配的內存應該被回收,這樣它可以用於其他對象(否則你將會有一個完全沒用的節點浪費內存)。

Swift使用automatic reference counting,因此它會檢測何時不存在對對象的引用並回收內存。內存將被回收,而無需做任何特別的事情。

如果這個節點仍然有對列表中下一個節點的引用,它是如何完全刪除的?

原始頭對另一個節點的引用並不妨礙它被系統回收。程序無法查詢哪些對象引用了其他節點,因此,如果原始頭部被回收(除了可用的額外內存除外),對程序的其餘部分沒有影響。

+0

非常感謝您的澄清。非常感激! – syedfa