我正在尝试从具有值val的整数的链接列表中删除所有元素。是否有必要将删除的节点设置为nil以释放内存?
func removeElements(_ head: Node?, _ val: Int) -> Node? {
var first = head
var current = head
var prev: Node?
while current != nil {
if current?.val != val {
prev = current
} else if current?.val == first?.val {
var oldFirst = first
first = current?.next
oldFirst = nil // is this line necessary?
} else {
prev?.next = current?.next // do I need to set current to nil?
}
current = current?.next
}
return first
}
答案 0 :(得分:1)
oldFirst = nil
仅将当前范围内的变量设置为nil
同样,current
是本地范围内的变量,它已经被解除引用,因此一旦离开其范围就会被清除。
如果你没有对某个对象的强引用,它会自行释放,因为Swift使用自动引用计数(ARC:https://en.wikipedia.org/wiki/Automatic_Reference_Counting)
我不确定为什么你的代码中有第二个案例。我想它会检查当前节点的值为val
但是与first.val
而不是val
进行比较的情况
答案 1 :(得分:0)
func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? {
guard head != nil else {
return nil
}
let preDummy = ListNode(val: 0), postDummy = ListNode(val: 0)
var pre = preDummy, node = head
while node != nil {
if node!.val == val {
postDummy.next = node?.next
node!.next = nil
} else {
pre.next = node
pre = node!
}
node = node!.next
}
pre.next = postDummy.next
return preDummy.next
}