我正在看一些使用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。
答案 0 :(得分:1)
您更正了index == 0
块执行后,将没有对原始head
的引用。这意味着对于程序的其余部分,您无法对该节点执行任何操作。应该回收为节点分配的内存,以便它可以用于其他对象(否则你将有一个浪费内存的完全无用的节点)。
Swift使用automatic reference counting,因此它会检测何时没有对象的引用并回收内存。记忆将在不需要做任何特殊事情的情况下回收。
如果该节点仍然具有对列表中下一个节点的引用,该节点如何被完全删除?
原始头部具有对另一个节点的引用这一事实并不妨碍系统回收它。程序无法查询哪些对象引用了其他节点,因此如果原始头部被回收,则对程序的其余部分没有任何影响(除了可用的额外内存之外)。