ios - 使用选项实现链表

标签 ios swift

给出链表节点的以下定义:

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()

...最终会得到 varAvarB 保存对不同对象的引用。

关于ios - 使用选项实现链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31256126/

相关文章:

ios - 与联系人关联的自定义标签 IOS OS X Contact Framework Swift

ios - iOS 浏览器是否通过浏览器上传包含 EXIF 照片元数据?

ios - "Banner View"的帧在运行时会有所不同。 iAd 适用于最大的屏幕,但在较小的屏幕上为空白

ios - 如何获取在 Xcode 的背景中选择的颜色代码?

ios - 如何从命令行获取设备的iOS版本?

ios - 使用 NSUserDefaults Swift 存储数据

swift - 使用动画删除行后更新 TableView 的最佳方法?

swift - 更改键盘动画弹跳的 Storyboard约束

ios - 在后台时显示整个接收内容的推送通知

ios - iOS 10 中的 UIActivityViewController