Swift单链列表节点未切断列表

时间:2018-12-14 01:13:00

标签: swift

有一件事我不太了解,例如:

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,所以它应该切断列表?

2 个答案:

答案 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保持不变,并且仍指向该节点对象。