当前位置:首页 > 文章列表 > 数据库 > MySQL > 四种常见链表的实现及时间复杂度分析(Python3版)

四种常见链表的实现及时间复杂度分析(Python3版)

来源:SegmentFault 2023-02-24 20:00:00 0浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《四种常见链表的实现及时间复杂度分析(Python3版)》,文章讲解的知识点主要包括区块链、MySQL、Linux、python、人工智能,如果你对数据库方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

四种常见的链表包括:单向链表,单向循环链表,双向链表,双向循环链表。
要实现的链表操作包括

  • class Node(object):
        """单节点"""
    
        def __init__(self, elem):
            self.elem = elem
            self.next = None
    
    
    class DoubleNode(Node):
        """双节点"""
    
        def __init__(self, elem):
            super(DoubleNode, self).__init__(elem)
            self.prev = None

    四种链表的实现中,每一个类都继承自

    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    # __author__ = 'zhao zi yang'
    
    class Node(object):
        """单节点"""
    
        def __init__(self, elem):
            self.elem = elem
            self.next = None
    
    
    class DoubleNode(Node):
        """双节点"""
    
        def __init__(self, elem):
            super(DoubleNode, self).__init__(elem)
            self.prev = None
    
    
    class SingleLinkList(object):
        """单链表"""
    
        def __init__(self, node=None):
            self.head = node
    
        def is_empty(self) -> bool:
            """链表是否为空 O(1)"""
            return self.head is None
    
        def length(self) -> int:
            """链表长度 O(n)"""
            count, cur = 0, self.head
            while cur is not None:
                cur = cur.next  # 不要写错cur = self.head.next, self.__next不是活动指针
                count += 1
            return count
    
        def traversing(self) -> '':
            """遍历所有节点 O(n)"""
            cur = self.head  # 不是 self._head
            while cur is not None:
                print(cur.elem, end=' ')
                cur = cur.next
            return ''
    
        def add(self, item) -> None:
            """头部添加节点 O(1)"""
            node = Node(item)
            node.next = self.head
            self.head = node
    
        def append(self, item) -> None:
            """尾部添加节点 O(n)"""
            node = Node(item)
            cur = self.head
            if self.is_empty():
                self.head = node
            else:
                while cur.next is not None:
                    cur = cur.next
                cur.next = node
    
        def insert(self, position: int, item) -> None:
            """
            节点插入到某个位置 O(n)
            :param position: 0表示第1个位置
            :param item:
            :return: None
            """
            if position = self.length():
                self.append(item)
            else:
                node = Node(item)
                count, cur = 1, self.head
                while count  None:
            """删除链表中的一个节点 O(n)"""
            pre, cur = None, self.head
            while cur is not None:
                if cur.elem == item:
                    if cur == self.head:
                        self.head = cur.next
                        break  # 只remove第一个元素
                    pre.next = cur.next
                    break
                pre = cur
                cur = cur.next
    
        def search(self, item) -> bool:
            """查找节点是否存在 O(n)"""
            cur = self.head
            while cur is not None:
                if cur.elem == item:
                    return True
                cur = cur.next
            return False
    
    
    class SingleCycleLinkList(SingleLinkList):
        """单向循环链表"""
    
        def __init__(self, node=None):
            if node:
                node.next = node
            super(SingleCycleLinkList, self).__init__(node=node)
    
        def length(self) -> int:
            """链表长度 O(n)"""
            if self.is_empty():
                return 0
            count, cur = 1, self.head
            while cur.next != self.head:
                cur = cur.next  # 不要写错cur = self.head.next, self.__next不是活动指针
                count += 1
            return count
    
        def traversing(self) -> '':
            """遍历所有节点 O(n)"""
            if not self.is_empty():
                cur = self.head  # 不是 self._head
                while cur.next != self.head:
                    print(cur.elem, end=' ')
                    cur = cur.next
                print(cur.elem, end=' ')
            return ''
    
        def add(self, item) -> None:
            """头部添加节点 O(n)"""
            node = Node(item)
            if self.is_empty():
                self.head = node
                node.next = node
            else:
                cur = self.head
                while cur.next != self.head:
                    cur = cur.next
                # 退出while循环之后cur指向尾结点
                node.next = self.head
                self.head = node
                cur.next = self.head
    
        def append(self, item) -> None:
            """尾部添加节点 O(n)"""
            node = Node(item)
            if self.is_empty():
                self.head = node
                node.next = node
            else:
                cur = self.head
                while cur.next != self.head:
                    cur = cur.next
                cur.next = node
                node.next = self.head
    
        def insert(self, position: int, item) -> None:
            """
            节点插入到某个位置 O(n)
            :param position: 0表示第1个位置
            :param item:
            :return: None
            """
            if position = self.length():
                self.append(item)
            else:
                node = Node(item)
                count, cur = 1, self.head
                while count  None:
            """删除链表中的一个节点 O(n)"""
            if self.is_empty():
                return
            pre, cur = None, self.head
            while cur.next != self.head:
                if cur.elem == item:
                    # 移除头结点
                    if cur == self.head:
                        rear = self.head
                        while rear.next != self.head:
                            rear = rear.next
                        self.head = cur.next
                        rear.next = self.head
                    # 移除中间节点
                    else:
                        pre.next = cur.next
                    return  # 结束。只remove第一个元素
                pre = cur
                cur = cur.next
            # 移除尾结点
            if cur.elem == item:
                if cur == self.head:
                    self.head = None
                else:
                    pre.next = self.head  # 或者 pre.next = cur.next
    
        def search(self, item) -> bool:
            """查找节点是否存在 O(n)"""
            if self.is_empty():
                return False
            else:
                cur = self.head
                while cur.next != self.head:
                    if cur.elem == item:
                        return True
                    cur = cur.next
                return cur.elem == item
    
    
    class DoubleLinkList(SingleLinkList):
        """双链表"""
    
        def add(self, item) -> None:
            """头部添加节点 O(1)"""
            node = DoubleNode(item)
            node.next = self.head
            self.head = node
            if node.next:  # 当原链表为空时
                node.next.prev = node
    
        def append(self, item) -> None:
            """尾部添加节点 O(n)"""
            node = DoubleNode(item)
            cur = self.head
            if self.is_empty():
                self.head = node
            else:
                while cur.next is not None:
                    cur = cur.next
                cur.next = node
                node.prev = cur
    
        def insert(self, position: int, item) -> None:
            """
            节点插入到某个位置 O(n)
            :param position: 0表示第1个位置
            :param item:
            :return: None
            """
            if position = self.length():
                self.append(item)
            else:
                node = DoubleNode(item)
                count, cur = 1, self.head
                while count  None:
            """删除链表中的一个节点 O(n)"""
            cur = self.head
            while cur is not None:
                if cur.elem == item:
                    if cur == self.head:
                        self.head = cur.next
                        if self.head:  # 只有一个节点的特殊情况
                            cur.next.prev = None
                    else:
                        cur.prev.next = cur.next
                        if cur.next:
                            cur.next.prev = cur.prev
                    break  # 只remove第一个元素
                cur = cur.next
    
    
    class DoubleCycleLinkList(SingleCycleLinkList):
        """双向循环链表"""
    
        def __init__(self, node=None):
            if node:
                node.next = node
                node.prev = node
            super(DoubleCycleLinkList, self).__init__(node=node)
    
        def add(self, item) -> None:
            """头部添加节点 O(n)"""
            node = DoubleNode(item)
            if self.is_empty():
                self.head = node
                node.next = node
                node.prev = node
            else:
                cur = self.head
                while cur.next != self.head:
                    cur = cur.next
                # 退出while循环之后cur指向尾结点,双向循环链表需要改动5个指针
                node.next = self.head  # 1.node.next指向原来的头结点
                node.prev = cur  # 2.node.prev指向尾结点,当前cur指向的节点
                cur.next.prev = node  # 3.原来头结点的prev指向要插入的node
                self.head = node  # 4.self.head指向要插入的node
                cur.next = node  # 5.尾结点的next指向要插入的node
    
        def append(self, item) -> None:
            """尾部添加节点 O(n)"""
            node = DoubleNode(item)
            if self.is_empty():
                self.head = node
                node.next = node
                node.prev = node
            else:
                cur = self.head
                # 退出while循环之后cur指向尾结点,双向循环链表需要改动4个指针
                while cur.next != self.head:
                    cur = cur.next
                cur.next.prev = node  # 1.原来头结点的.prev指向要插入的node
                cur.next = node  # 2.原来尾结点.next指向要插入的node
                node.prev = cur  # 3.node.prev指向原来的尾节点
                node.next = self.head  # 4.node.next指向头结点
    
        def insert(self, position: int, item) -> None:
            """
            节点插入到某个位置 O(n)
            :param position: 0表示第1个位置
            :param item:
            :return: None
            """
            if position = self.length():
                self.append(item)
            else:
                node = DoubleNode(item)
                count, cur = 1, self.head
                while count  None:
            """删除链表中的一个节点 O(n)"""
            if self.is_empty():
                return
            cur = self.head
            while cur.next != self.head:
                if cur.elem == item:
                    # 移除头结点
                    if cur == self.head:
                        cur.prev.next = cur.next
                        cur.next.prev = cur.prev
                        self.head = cur.next
                    # 移除中间节点
                    else:
                        cur.prev.next = cur.next
                        cur.next.prev = cur.prev
                    return  # 结束。只remove第一个元素
                cur = cur.next
            # 移除尾结点
            if cur.elem == item:
                if cur == self.head:  # 当链表只有一个节点时
                    self.head = None
                else:
                    cur.next.prev = cur.prev
                    cur.prev.next = cur.next
    
    
    if __name__ == '__main__':
        print("----single_link_list-----")
        single_link_list = SingleLinkList()
        single_link_list.remove('test')
        print(single_link_list.is_empty(), single_link_list.length())
        single_link_list.insert(-1, 'zhao')
        print(single_link_list.is_empty(), single_link_list.length())
        single_link_list.insert(3, 'zi')
        print(single_link_list.length())
        single_link_list.append('yang')
        single_link_list.add("head")
        single_link_list.insert(4, "tail")
        print(single_link_list.traversing())
        single_link_list.remove(1)
        print(single_link_list.traversing())
        single_link_list.remove("head")
        print(single_link_list.traversing())
        single_link_list.remove("tail")
        print(single_link_list.traversing())
        single_link_list.remove('zi')
        print(single_link_list.traversing())
    
        print("\n----single_cycle_link_list-----")
        single_cycle_link_list = SingleCycleLinkList()
        single_cycle_link_list.remove('test')
        print(single_cycle_link_list.is_empty(), single_cycle_link_list.length())
        single_cycle_link_list.insert(-1, 'zhao')
        print(single_cycle_link_list.is_empty(), single_cycle_link_list.length())
        single_cycle_link_list.insert(3, 'zi')
        print(single_cycle_link_list.length())
        single_cycle_link_list.append('yang')
        single_cycle_link_list.add("head")
        single_cycle_link_list.insert(4, "tail")
        print(single_cycle_link_list.traversing())
        single_cycle_link_list.remove(1)
        print(single_cycle_link_list.traversing())
        single_cycle_link_list.remove("head")
        print(single_cycle_link_list.traversing())
        single_cycle_link_list.remove("tail")
        print(single_cycle_link_list.traversing())
        single_cycle_link_list.remove('zi')
        print(single_cycle_link_list.traversing())
    
        print("\n----double_link_list-----")
        double_link_list = DoubleLinkList()
        double_link_list.remove('test')
        print(double_link_list.is_empty(), double_link_list.length())
        double_link_list.insert(-1, 'zhao')
        print(double_link_list.is_empty(), double_link_list.length())
        double_link_list.insert(3, 'zi')
        print(double_link_list.length())
        double_link_list.append('yang')
        double_link_list.add("head")
        double_link_list.insert(4, "tail")
        print(double_link_list.traversing())
        double_link_list.remove(1)
        print(double_link_list.traversing())
        double_link_list.remove("head")
        print(double_link_list.traversing())
        double_link_list.remove("tail")
        print(double_link_list.traversing())
        double_link_list.remove('zi')
        print(double_link_list.traversing())
    
        print("\n----double_cycle_link_list-----")
        double_cycle_link_list = DoubleCycleLinkList()
        double_cycle_link_list.remove('test')
        print(double_cycle_link_list.is_empty(), double_cycle_link_list.length())
        double_cycle_link_list.insert(-1, 'zhao')
        print(double_cycle_link_list.is_empty(), double_cycle_link_list.length())
        double_cycle_link_list.insert(3, 'zi')
        print(double_cycle_link_list.length())
        double_cycle_link_list.append('yang')
        double_cycle_link_list.add("head")
        double_cycle_link_list.insert(4, "tail")
        print(double_cycle_link_list.traversing())
        double_cycle_link_list.remove(1)
        print(double_cycle_link_list.traversing())
        double_cycle_link_list.remove("head")
        print(double_cycle_link_list.traversing())
        double_cycle_link_list.remove("tail")
        print(double_cycle_link_list.traversing())
        double_cycle_link_list.remove('zi')
        print(double_cycle_link_list.traversing())

    结果运行如下:

    ----single_link_list-----
    True 0
    False 1
    2
    head zhao zi yang tail 
    head zhao zi yang tail 
    zhao zi yang tail 
    zhao zi yang 
    zhao yang 
    
    ----single_cycle_link_list-----
    True 0
    False 1
    2
    head zhao zi yang tail 
    head zhao zi yang tail 
    zhao zi yang tail 
    zhao zi yang 
    zhao yang 
    
    ----double_link_list-----
    True 0
    False 1
    2
    head zhao zi yang tail 
    head zhao zi yang tail 
    zhao zi yang tail 
    zhao zi yang 
    zhao yang 
    
    ----double_cycle_link_list-----
    True 0
    False 1
    2
    head zhao zi yang tail 
    head zhao zi yang tail 
    zhao zi yang tail 
    zhao zi yang 
    zhao yang 

    搜索关注微信公众号:寸土币争 ID:

    bbcoins

    bbcoins.jpg

    文中关于mysql的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《四种常见链表的实现及时间复杂度分析(Python3版)》文章吧,也可关注golang学习网公众号了解相关技术文章。

版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
MySQL组复制-初见MySQL组复制-初见
上一篇
MySQL组复制-初见
mysql学习一:SQL基础
下一篇
mysql学习一:SQL基础
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    514次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    499次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • SEO  AI Mermaid 流程图:自然语言生成,文本驱动可视化创作
    AI Mermaid流程图
    SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
    519次使用
  • 搜获客笔记生成器:小红书医美爆款内容AI创作神器
    搜获客【笔记生成器】
    搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
    509次使用
  • iTerms:一站式法律AI工作台,智能合同审查起草与法律问答专家
    iTerms
    iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
    537次使用
  • TokenPony:AI大模型API聚合平台,一站式接入,高效稳定高性价比
    TokenPony
    TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
    588次使用
  • 迅捷AIPPT:AI智能PPT生成器,高效制作专业演示文稿
    迅捷AIPPT
    迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
    506次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码