有一件事我不太了解,例如:
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
现在,当我执行printlist(l1)
时,它会打印:
1 2 3
这是正确的。
如果我先设置l2.next = nil
,然后再设置printList(l1)
,该怎么办?输出为:1 2
,据我所知。
我不明白的是,如果我先设置l2 = nil
然后设置printList(l1)
,它仍然会打印1 2 3
。
当第二个节点变为nil时为什么不打印1
,所以它应该切断列表?
答案 0 :(得分:1)
变量l2是对Node(2)对象的引用。将l2设置为nil不会影响对象本身,只会删除该引用。 Node(1).next仍引用Node(2),而Node(2).next仍引用Node(3)
您可能会想到这样的初始设置
l1 -> Node(1) | v l2 -> Node(2) | v l3 -> Node(3)
将l2设置为nil后,就像这样
l1 -> Node(1) | v Node(2) | v l3 -> Node(3)
在评估printlist(l1)时,无论是l2还是l3都不重要
如果要从列表中删除Node(2),请更新Node(3)旁边的Node(1).next。例如。
l1.next = l3
您的图片看起来像这样:
l1 -> Node(1) ---| | | l2 -> Node(2) | | | l3 -> Node(3) <--|
答案 1 :(得分:0)
这是因为L2引用了内存中的节点对象并将其设置为L1.next,也使L1.next引用了内存中的同一对象。因此,将L2设置为nil意味着L2变量不应再引用该节点对象,而是L1.next保持不变,并且仍指向该节点对象。