双向链表在Swift中的简单实现

结点数据结构

class ListNode<T> {
    var value: T
    weak var previous: ListNode?
    var next: ListNode?
    init(value: T) {
        self.value = value
        self.previous = nil
        self.next = nil
    }
}
复制代码

双向链表的数据结构

class LinkList<T> {
    typealias Node = ListNode<T>
    
    var head: Node?
    var first: Node? {
        return head
    }
    var last: Node? {
        guard var node = head else { return nil }
        while let next = node.next {
            node = next
        }
        return node
    }
    
    var isEmpty: Bool {
        return head == nil
    }
    var count: Int {
        guard var node = head else { return 0 }
        var cut = 0
        while let next = node.next {
            node = next
            cut += 1
        }
        return cut
    }
}
复制代码

链表对结点操作的一些方法
查找结点

    func getNode(at index: Int) -> Node? {
        if index == 0 { return head }
        if index > count { return nil }
        var node = head!.next
        for _ in 1..<index {
            node = node?.next
            if node == nil {
                // return nil
                break
            }
        }
        return node
    }
复制代码

增加结点

    func append(_ value: T) {
        let newNode = Node(value: value)
        if let last = last {
            last.next = newNode
            newNode.previous = last
        } else {
            //空链表
            head = newNode
        }
    }
    
    func insertHead(_ value: T) {
        let newNode = Node(value: value)
        if var head = head {
            newNode.next = head
            head.previous = newNode
            head = newNode
        } else {
            head = newNode
        }
    }
    
    func insert(_ value: T ,atIndex index: Int) {
        if index < 0 {
            return
        }
        let newNode = Node(value: value)
        if count == 0 {
            head = newNode
        } else {
            if index == 0 {
                newNode.next = head
                head?.previous = newNode
                head = newNode
            } else {
                if index > count {
                    return
                }
                
                let nodeP = getNode(at: index - 1)
                let nodeN = nodeP?.next
                
                nodeP?.next = newNode
                newNode.previous = nodeP
                
                nodeN?.previous = newNode
                newNode.next = nodeN
                
            }
        }
    }
复制代码

删除结点

    func removeAll() {
        head = nil
    }
    
    func removeLast() -> T? {
        if isEmpty { return nil }
         return removeNode(atIndex: count)
    }
    
    func removeNode(node: Node) -> T? {
        guard head != nil else {
            return nil
        }
        
        let prev = node.previous
        let next = node.next
        
        //当某结点 prev 为空时,即为 head 结点
        if let prev = prev {
            prev.next = next
        } else {
            head = next
        }
        next?.previous = prev // 此时 prev 仍旧为optional值,
        
        //清空node信息
        node.previous = nil
        node.next = nil
        return node.value
    }
    
    func removeNode(atIndex index: Int) -> T? {
        if head == nil {
            return nil
        }
        
        let node = getNode(at: index)
        let prev = node?.previous
        let next = node?.next
        //当某结点 prev 为空时,即为 head 结点
        if let prev = prev {
            prev.next = next
        } else {
            head = next
        }
        next?.previous = prev
        
        //清空node信息
        node?.previous = nil
        node?.next = nil
        return node?.value
    }
复制代码
  • 学习了 J_Knight_ 文章之后,敲一敲代码加深印象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值