2017-06-18 37 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