美文网首页
双向链表的实现

双向链表的实现

作者: 梁森的简书 | 来源:发表于2021-01-30 23:39 被阅读0次
/// 节点类
fileprivate class Node {
    var item: String?
    var pre: Node?
    var next: Node?
    init(item: String?, pre: Node?, next: Node?) {
        self.item = item
        self.pre = pre
        self.next = next
    }
}

/// 双向链表
class TwoWayLinkList {
    
    /// 头节点
    private var head = Node(item: nil, pre: nil, next: nil)
    /// 尾节点
    private var footer = Node(item: nil, pre: nil, next: nil)
    /// 链表长度
    var length = 0
    
    /// 初始化链表
    init() {
        self.head = Node(item: nil, pre: nil, next: nil)
        self.footer = Node(item: nil, pre: nil, next: nil)
        length = 0
    }
    
    func isEmpty() -> Bool {
        if length == 0 {
            return true
        } else {
            return false
        }
    }
    
    func getFirstItem() -> String? {
        if isEmpty() == true {
            return nil
        } else {
            return head.next?.item
        }
    }
    
    func getLastItem() -> String? {
        if isEmpty() == true {
            return nil
        } else {
            return footer.item
        }
    }
    
    func addItem(item: String) {
        if isEmpty() == true {
            let newNode = Node(item: item, pre: head, next: nil)
            head.next = newNode
            footer = newNode
        } else {
            let oldFooter = footer
            let newNode = Node(item: item, pre: oldFooter, next: nil)
            oldFooter.next = newNode
            footer = newNode
        }
        length += 1
    }
    
    func insertItem(item: String, index: Int) {
        var pre = head
        for _ in 0..<index {
            pre = pre.next!
        }
        let curNode = pre.next
        let newNode = Node(item: item, pre: pre, next: curNode)
        pre.next = newNode
        curNode?.pre = newNode
        length += 1
    }
    
    func getItem(index: Int) -> String? {
        var n = head.next
        for _ in 0..<index {
            n = n?.next!
        }
        return n?.item
    }
    
    func indexOfItem(item: String) -> Int {
        var n = head
        for i in 0..<length {
            n = n.next!
            if n.item == item {
                return i
            }
        }
        return -1
    }
    
    func deleteItemOfIndex(index: Int) -> String? {
        var pre = head
        for _ in 0..<index {
            pre = pre.next!
        }
        let curNode = pre.next
        let nextNode = curNode?.next
        pre.next = nextNode
        nextNode?.pre = pre
        length -= 1
        return curNode?.item
    }
    
    /// 清空
    func clear() {
        head.next = nil
        length = 0
    }
    
}

demo地址:https://github.com/yangguanghei/studyDateStructure

相关文章

  • 双向链表python实现

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

  • 9.双向链表DoubleLinkList

    目录:1.双向链表的定义2.双向链表的图解3.双向链表定义操作4.双向链表的实现 1.双向链表的定义 2.双向链表...

  • 五. java数据结构 - 双向链表

    1. 双向链表的操作分析和实现 使用带 head 头的双向链表实现 –水浒英雄排行榜 分析 双向链表的遍历,添加,...

  • 深入分析 LinkedList

    基于JDK 1.8.0。 简介: LinkedList 底层是通过双向链表来实现的。 特点: 底层实现:双向链表 ...

  • C语言中的链表(3)①

    双向链表的实现 双向链表也叫双链表,是链表的一种,它的每个数...

  • 数据结构——Golang实现双向链表

    转载请注明出处:数据结构——Golang实现双向链表 1. 双向链表 双向链表也叫双链表,是链表的一种,它的每个数...

  • 链表

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

  • LRU缓存算法

    1. LRU缓存可使用一个HashMap和双向链表实现 1.1定义双向链表的节点: 1.2实现:

  • 双向链表 应用

    前言 通过双向链表实现session的过期扫描。 双向链表 go 中实现为 list.List 实例 web开发中...

  • Python实现双向链表

    Python实现双向链表的增删改查,反转链表

网友评论

      本文标题:双向链表的实现

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