需要澄清使用Swift链接列表

时间:2017-06-18 03:39:58

标签: swift linked-list

我正在看一些使用Swift实现LinkedList的代码,我需要有人为我澄清一些事情。首先,下面是我的LinkedList类的代码,以及我从列表中删除Node的函数:

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 个答案:

答案 0 :(得分:1)

您更正了index == 0块执行后,将没有对原始head的引用。这意味着对于程序的其余部分,您无法对该节点执行任何操作。应该回收为节点分配的内存,以便它可以用于其他对象(否则你将有一个浪费内存的完全无用的节点)。

Swift使用automatic reference counting,因此它会检测何时没有对象的引用并回收内存。记忆将在不需要做任何特殊事情的情况下回收。

  

如果该节点仍然具有对列表中下一个节点的引用,该节点如何被完全删除?

原始头部具有对另一个节点的引用这一事实并不妨碍系统回收它。程序无法查询哪些对象引用了其他节点,因此如果原始头部被回收,则对程序的其余部分没有任何影响(除了可用的额外内存之外)。