One question about linklist node

there is one thing I am not quite understand ,for example

public class Node
{
var val:Int
var next:Node?
init(_ val:Int)
{
self.val = val
self.next = nil
}
}

func printList(_ node:Node?)
{
var cur = node
while cur != nil
{
print(cur!.val, terminator: " ")
cur = cur.next
}
}
var l1 = Node(1)
var l2 = Node(2)
var l3 = Node(3)

l1.next = l2
l2.next = l3

now I use printlist(l1)
it print
1 2 3
which is right

what if I set
l2.next = nil
then printList(l1)
which show 1 2

which I can understand

what I dont understand

if I set

l2 = nil

then to printList(l1)

it still print
1 2 3

why not just print
1

as the second node has become nil, it should cut off the list

something I misunderstanding here?

@kelvin_lau Can you please help with this when you get a chance? Thank you - much appreciated! :]

This is about using reference variables to refer to objects.

This line creates a new node and makes l2 a reference to it:
var l2 = Node(2)

This line makes l1.next a reference to the same node:
l1.next = l2

When you set l2 to nil, l2 is no longer a reference to the node, but l1.next still is. The node itself will stick around as long as some variable has a reference to it.

The printlist() method starts with l1 and follows the chain of next references. It is not using the l2 or l3 references.

The linked list should always point to null as the last element so that you know you have arrived at the end of the line. So to begin with when you initialize it you make it’s next element null since it is the last element to begin with.

What @sgerrard said is correct.

To unlink the 1 from the rest of the list, you’d write l1.next = nil.

so another question ,what is the best way to clear all the node in the linklist from memory?

for above example l1->l2-l3

@kelvin_lau Can you please help with this when you get a chance? Thank you - much appreciated! :]

In Swift, memory management is handled by ARC.

As long as a node has no more references pointing to it, it’ll be deallocated. For the linked list, simply removing the reference to the list would deallocate the entire list.