给出链表节点的以下定义:
class ListNode {
var value: Int = 0
var node: ListNode? = nil
static var root:ListNode? = nil
init() {
}
init(value:Int) {
self.value = value
}
然后插入函数的以下实现将起作用:
if (ListNode.root == nil) {
ListNode.root = ListNode(value: value)
}
else {
var temp = ListNode.root
while (temp!.node != nil) {
temp = temp!.node
}
temp!.node = ListNode(value: value)
}
但是,相同功能的这种实现不起作用:
var temp = ListNode.root
while temp != nil {
temp = temp!.node
}
temp = ListNode(value: value)
为什么后者不起作用以及如何重写它(以简洁的形式并且不使用递归)才能起作用? 如果问题是由于 temp 是副本而不是引用造成的,那么如何将其变成引用?
(它不起作用,因为 ListNode.root 在插入后保持不变)
最佳答案
在后一种情况下,ListNode.root 保持不变,因为它没有在任何地方分配任何内容。
我将按如下方式实现:
class ListNode {
static var root: ListNode? = nil
static var tail: ListNode? = nil
var nextNode: ListNode? = nil
var value: Int = 0
init() { }
init(value: Int) {
self.value = value
}
static func insert(value: Int) {
switch tail {
case nil:
ListNode.root = ListNode(value: value)
ListNode.tail = ListNode.root
default:
let newTail = ListNode(value: value)
ListNode.tail?.nextNode = newTail
ListNode.tail = newTail
}
}
}
[更新]
Swift中有两种类型的属性/变量,即值和对象。
当 value 属性(例如 Int
或某些 struct
)被分配给(临时)变量时,它就会被复制。新变量将与原始变量不同,也就是说,对其中一个变量的任何更改都不会自动反射(reflect)在另一个变量中。
现在,对象有点不同了。它们本质上是按值复制的指针。 IE。如果您有两个引用到相同对象的变量,则更改<其中一个的属性将被另一个“看到”(因为两者的指针都指向同一内存区域)。但如果两者都是零,那么就没有什么可分享的。
此外,如果您为 varA
分配新对象,那么 varB
将保持指向同一个旧对象。 IE。以下内容:
let varA = SomeObject()
let varB = varA
lat varA = SomeObject()
...最终会得到 varA
和 varB
保存对不同对象的引用。
关于ios - 使用选项实现链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31256126/