我正在查看一些使用 Swift 实现 LinkedList 的代码,我需要有人为我澄清几件事。 首先,下面是我的 LinkedList 类的代码,以及我从列表中删除节点的函数:
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。
更正了在执行index == 0
块后,将没有对原始head
的引用。这意味着对于程序的其余部分,您无法对该节点执行任何操作。最好回收为节点分配的内存,以便它可以用于其他对象(否则您将拥有一个完全无用的节点,浪费内存)。
Swift 使用自动引用计数,因此它会检测何时没有对对象的引用并回收内存。内存将被回收,而无需您做任何特殊的事情。
如果此节点仍具有对列表中下一个节点的引用,如何完全删除此节点?
原始头部具有对另一个节点的引用这一事实并不妨碍系统回收它。程序无法查询哪些对象引用了该其他节点,因此如果回收原始磁头(除了可用的额外内存),则与程序的其余部分没有区别。