美文网首页Swift学习
Swift- 链表实现

Swift- 链表实现

作者: ricefun | 来源:发表于2020-01-16 13:48 被阅读0次
/*双向链表*/
//节点
public class Node<T> {
    var value:T
    weak var previous:Node?//避免循环引用
    var next:Node?
    init(value:T) {
        self.value = value
    }
}
//链表
public class NodeLlist<T> {
    fileprivate var head:Node<T>?
    private var tail:Node<T>?
    
    public var isEmpty:Bool {
        return head == nil
    }
    
    public var first:Node<T>? {
        return head
    }
    
    public var last : Node<T>? {
        return tail
    }
    //Node add
    public func append(value:T) {
        //1.
        let newNode = Node(value: value)
        //2.
        if let tailNode = tail {
            newNode.previous = tailNode
            tailNode.next = newNode
        } else {
            head = newNode
        }
        //3.
        tail = newNode
    }
    
    //Node at
    public func nodeAt(index:Int) -> Node<T>? {
        //1.大于等于0才有意义
        if index >= 0 {
            //b2.遍历到目标node,就返回
            var node = head
            var i = index
            while node != nil {
                if i == 0 {
                    return node
                }
                i -= 1
                node = node!.next
            }
        }
        return nil
    }
    
    //move
    public func remove(node:Node<T>) -> T {
        let prevNode = node.previous
        let nextNode = node.next
        //1.node如果有prevNode,说明不是head(链表的第一个节点),那么就更新next指针
        if let prev = prevNode {
          prev.next = nextNode
        } else { //2.没有就说明这个node是head(链表的第一个节点),直接将next提为head
          head = nextNode
        }
        //3.将previous指针指向被移除的节点的previous指针。
        nextNode?.previous = prevNode
        //4.如果你移除的是链表的最后一个节点,那么就更新tail指针。
        if nextNode == nil {
          tail = prevNode
        }
        
        //5.将移除的节点的previous和next指针置为nil。
        node.previous = nil
        node.next = nil
        
        //6.返回移除的节点。
        return node.value
    }
    
    //move all
    public func removeAll() {
        head = nil
        tail = nil
    }
}

//重写 description属性 用于打印
extension NodeLlist: CustomStringConvertible {
    public var description: String {
        var text = "["
        var node = head
        while node != nil {
            text += "\(node!.value)"
            node = node!.next
            if node != nil { text += ", " }
        }
        return text + "]"
    }
}

extension Node : CustomStringConvertible {
    public var description: String {
        return "\(value)"
    }
}

let egNodeList = NodeLlist<String>()
egNodeList.append(value: "dog")
egNodeList.append(value: "cat")
egNodeList.append(value: "rabbit")
egNodeList.append(value: "person")

print(egNodeList)
print(egNodeList.nodeAt(index: 5) ?? "没有找到哦")
print(egNodeList.first ?? "is nil")
print(egNodeList.last ?? "is nil")

本文参考链接

相关文章

  • Swift- 链表实现

    本文参考链接

  • 单链表 & 双链表& 单向循环链表的实现

    单链表 具体实现: 双链表 代码实现: 单向循环链表的实现 代码实现:

  • 链表

    一、单向链表 单向链表的普通实现 Java实现: Kotlin实现: 单向链表的递归实现 Java实现: 二、双向...

  • 链表

    单链表 C实现 Java实现 双链表 C实现 Java实现

  • 双向链表python实现

    python 双向链表实现 双向链表实现 链表头部添加 链表尾部添加 插入 删除 查询结点

  • Python数据结构-链表

    自己实现一遍果然感觉不一样 Python实现单链表 Python实现单项循环链表 Python实现双向链表

  • Swift-进阶:Mirror源码解析

    本文主要是分析Mirror的底层实现,以及根据Mirror底层原理仿写其结构的实现 在Swift-进阶:反射Mir...

  • JavaScript数据结构与算法-链表练习

    链表的实现 一. 单向链表 二. 双向链表 三. 循环链表 练习 一. 实现advance(n)方法,使当前节点向...

  • 数据结构java描述

    接口 栈 队列 集合 并查集 映射 数组 链表 栈 数组实现 链表实现 队列 数组实现 链表实现 二分搜索树 集合...

  • 线性表之单链表实现

    线性表之单链表实现 实现单链表的初始化、插入、删除等基本运算 实现单链表的输入、输出运算 实现单链表的逆置、归并、...

网友评论

    本文标题:Swift- 链表实现

    本文链接:https://www.haomeiwen.com/subject/iayfzctx.html