数据结构-链表

112 阅读1分钟

不多说,直接上swift代码

class LinkNode<T> {
    var data: T // 存储的数据
    weak var prev: LinkNode<T>? // 指向上一个节点
    var next: LinkNode<T>? // 指向下一个节点
    init(_ data:T) {
        self.data = data
    }
}
class LinkList<T>: NSObject {
    typealias Node = LinkNode<T> // 节点的别名
    private var header: Node? // 头指针
    private var tail: Node?   // 尾指针
    
    public var firstNode: Node? {
        return header
    }
    public var lastNode: Node? {
        return tail
    }
    public var isEmpty: Bool {
        return header == nil
    }
    // 节点个数
    public var count: Int {
        guard var node = header else {
            return 0
        }
        var count = 1
        while let next = node.next {
            node = next
            count += 1
        }
        return count
    }
    // 向尾部添加节点
    func append(value: T) -> Void {
        let newNode = LinkNode(value)
        
        if let last = tail {
            // 链表有节点
            last.next = newNode
            newNode.prev = last
        }else {
            // 链表没节点,头部指针指向新节点
            header = newNode
        }
        // 尾部指针指向新节点
        tail = newNode
    }
    // 获取某个位置的节点
    func find(atIndex index:Int) -> Node? {
        guard var node = header else {
            return nil
        }
        if index == 0 {
            return node
        }
        var i = 1;
        while let next = node.next {
            node = next
            if i == index {
                return node
            }
            i += 1
        }
        return nil
    }
    // 在某个位置插入节点
    func insert(_ newNode: Node, atIndex index:Int) {
        if index < 0 {
            return
        }
        guard let _ = header else {
            append(value: newNode.data)
            return
        }
        
        if index == 0 {
            header?.prev = newNode
            newNode.next = header
            header = newNode
            
        }else if index >= count {
            // 越界 在尾部添加节点
            append(value: newNode.data)
            
        }else {
            
            let prevNode = find(atIndex: index - 1)
            let nextNode = prevNode?.next
            
            newNode.prev = prevNode
            newNode.next = nextNode
            prevNode?.next = newNode
            nextNode?.prev = newNode
        }
    }
    // 删除节点
    func remove(_ node:Node) {
        let next = node.next
        if let prev = node.prev {
            prev.next = next
            next?.prev = prev
        }else {
            header = next
        }
        node.prev = nil
        node.next = nil
    }
    func remove(atIndex index:Int) {
        guard let node = find(atIndex: index) else {
            return
        }
        remove(node)
    }
}