Swift 3从单链表中删除节点

时间:2017-09-11 21:50:44

标签: swift linked-list

我正在尝试从具有值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
}

2 个答案:

答案 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
}
相关问题