swift - 如何使用 Swift 检测链表中的循环/周期

标签 swift algorithm data-structures linked-list

<分区>

我正在尝试使用 Swift 检测链表中的循环/周期的函数。 有人可以告诉我代码如何做到这一点吗? 我在其他一些我不太熟悉的编程语言中找到的唯一答案

这是我目前正在处理的代码。

public class Node<Value> {

    public var value: Value
    public var next: Node?

    public init(value: Value, next: Node? = nil) {
        self.value = value
        self.next = next
    }
}

public struct LinkedList<Value> {

    public var head: Node<Value>?
    public var tail: Node<Value>?

    public init() {}

    public var isEmpty: Bool {
        return head == nil
    }

    public mutating func push(_ value: Value) {
        head = Node(value: value, next: head)
        if tail == nil {
            tail = head
        }
    }

    public mutating func apped(_ value: Value) {

        guard !isEmpty else {
            push(value)
            return
        }
        tail!.next = Node(value: value)

        tail = tail!.next
    }
}

extension Node: CustomStringConvertible {

    public var description: String {
        guard let next = next else {
            return "\(value)"
        }

        return "\(value) -> "  + String(describing: next) + " "
    }
}

extension LinkedList: CustomStringConvertible {

    public var description: String {
        guard let head = head else {
            return "Empty List"
        }
        return String(describing: head)
    }
}

最佳答案

一种方法是遍历列表,以某种方式跟踪先前访问过的节点;最终,您将访问之前访问过的节点(因此知道有循环)或到达终点(并且知道没有循环)。

一种更聪明的方法是使用 2 个指针遍历列表,但其中一个指针的移动速度是另一个指针的两倍。如果存在循环,在某个时刻,较快的指针会在循环中追上较慢的指针,因此没有明确需要跟踪先前访问过的节点。

关于swift - 如何使用 Swift 检测链表中的循环/周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57772610/

相关文章:

ios - 无法为类型 UnsafeMutablePointer<UInt8> 调用初始值设定项

ios - 数组不堆叠Class对象

string - Kickstart 2017(apac) 模式重叠

objective-c - 重置密码算法

c - 如何为函数内部的结构分配动态内存槽,可以从程序中的任何位置访问该结构

swift - CoreData 仅在我重新启动应用程序后更新?

ios - 快速取消 AsyncTask 的正确方法

algorithm - Google 搜索图片算法 - 它是如何工作的?

适用于将字符串与正则表达式模式匹配的数据库或结构

algorithm - 除了对完整性的要求外,B-tree 和 B*-tree 之间有什么区别?