用Swift试着实现一个单链表

247 阅读1分钟
// 单链表中的一个节点:
public class LinkListNode<T> {
    var val : T
    var pre : LinkListNode<T>?
    var next: LinkListNode<T>?
    init(val: T) {
        self.val = val
    }
}

// 单链表:
public class LinkedList<T> {
    public typealias Node = LinkListNode<T>
    private var head: Node?
    
    // 首结点:
    public var first: Node? {
        return head
    }
    
    // 尾节点:
    public var last: Node? {
        // 空链表没有尾结点:
        guard var node = head else { return nil  }
        // 循环赋值找到 nil之前的那个节点:
        while let next = node.next { node = next }
        
        return node
    }
    
    // 添加节点:
    public func append(_ val: T) {
        // 要添加新节点:
        let newNode = Node(val: val)
        // 当前链表至少有一个节点:
        if let last = last {
            // 双向链表前后链上:
            last.next = newNode
            newNode.pre = last
        }
        // 当前链表没有节点: head = nil;
        else {
            head = newNode
        }
    }
    
    // 个数:
    public var count: Int {
        guard var node = head else { return 0 }
        var count = 1;
        // 循环遍历链表:
        while let next = node.next {
            node = next;
            count += 1
        }
        return count
    }
    
    // 打印 1 -> 2 -> 3 -> nil:
    public var toString: String {
        // 头结点千万不能为空: 为空的话就return 一个空数组:
        guard var node = head else { return "[]" }
        var pre = ""
        while let next = node.next {
            pre += "\(node.val) -> "
            node = next
        }
        // 最后一个节点的 next 是 nil , 不会进入上面的循环 , 所以这里要补充一个赋值最后一个节点的 val:
        pre += "\(node.val) -> "
        pre += "nil"
        
        return pre
    }
}

let listNode = LinkedList<String>()
listNode.append("1")
listNode.append("2")
listNode.append("3")
listNode.append("4")
print(listNode.toString)
print(listNode.count)

视频链接:

www.bilibili.com/video/BV1Dg…