yanqing liu
yanqing liu

Reputation: 25

Swift 3 delete nodes from singly linked list

I am trying to remove all elements from a linked list of integers that have value val. Is it necessary to set the removed nodes to nil to free memory?

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
}

Upvotes: 0

Views: 1245

Answers (2)

Hunter
Hunter

Reputation: 1

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
}

Upvotes: 0

Simon
Simon

Reputation: 2469

oldFirst = nil only sets the variable in your current scope to nil.
Again, current is a variable in your local scope, it gets already dereferenced and thus cleaned up once you leave its scope.

If you have no strong references to an object anymore it is released by itself because Swift uses Automatic Reference Counting (ARC: https://en.wikipedia.org/wiki/Automatic_Reference_Counting)

I am not sure why you have the 2nd case in your code. I guess it checks the case where the current node has value val but you compare to first.val instead of val

Upvotes: 2

Related Questions