顺序表和链表作为线性表的典型结构,上一篇已经说了顺序表在python中的典型应用:list和tuple,《顺序表数据结构在python中的应用》,今天来实现链表的基本结构之一:单向链表。

单向链表模型:

链表是一个个节点连接而成,节点由两部分构成:元素域、链接域;链接域链接下一个节点,从而构成一条链条,而python主要实现单个节点对象,从而构成链条。

python实现一个节点对象:

class node:    def __init__(self, item):        self.item = item  # 该节点值        self.next = None   #  连接一下一个节点

定义一个链条对象:

class SinglyLinkedList:    """链表对象"""    def __init__(self):        self._head = None

链表对象从头部开始,链接一个个节点,下面我们添加一个在头部和尾部增加节点的方法。

class Node:    def __init__(self, item):        self.item = item  # 该节点值        self.next = None   #  连接一下一个节点

class SinglyLinkedList:    """链表对象"""    def __init__(self):        self._head = None

    def add(self, item):        """        头部添加节点        :param item: 节点值        :return:        """        node = Node(item)        node.next = self._head        self._head = node

    def append(self, item):        """        尾部添加节点        :param items:        :return:        """        cur = self._head        if not cur:  # 判断是否为空链表            self.add(item)        else:            node = Node(item)            while cur.next:                cur = cur.next            cur.next = node

其中注意在尾部添加节点的时候要判断是否为空链表,如果是空链表就直接用头部添加方法,如果不是空链表,那么需要遍历到最后一个节点上添加节点。

那我们给链表添加一些实现属性的方法,是否为空、链表长度、遍历链表等。

class Node:    def __init__(self, item):        self.item = item  # 该节点值        self.next = None   #  连接一下一个节点

class SinglyLinkedList:    """链表对象"""    def __init__(self):        self._head = None

    @property    def is_empty(self):        """        判断链表是否为空,只需要看头部是否有节点        :return:        """        if self._head:            return False        else:            return True

    @property    def length(self):        """        获取链表长度        :return:        """        cur = self._head        n = 0        if not cur:            return n        else:            while cur.next:                cur = cur.next                n += 1            return n+1

    def ergodic(self):        """        遍历链表        :return:        """        cur = self._head        if not cur:            print('None')        else:            while cur.next:                print(cur.item)                cur = cur.next            print(cur.item)

接下来继续增加我们链表的插入节点和删除节点以及判断节点是否存在的方法。

class Node:    def __init__(self, item):        self.item = item  # 该节点值        self.next = None   #  连接一下一个节点

class SinglyLinkedList:    """链表对象"""    def __init__(self):        self._head = None

    def insert(self, index, item):        """        在指定位置插入节点(设置索引从0开始)        :param item:        :return:        """        if index == 0:  # 当索为0则头部插入            self.add(item)        elif index >= self.length:  # 当索引超范围则尾部插入            self.append(item)        else:  # 找到插入位置的上一个节点,修改上一个节点的next属性            cur = self._head            n = 1            while cur.next:                if n == index:                    break                cur = cur.next                n += 1            node = Node(item)            node.next = cur.next            cur.next = node

    def deltel(self, item):        """        删除节点        :param item:        :return:        """        if self.is_empty:  # 节点为空的情况            raise ValueError("null")        cur = self._head        pre = None  # 记录删除节点的上一个节点        if cur.item == item:  # 当删除节点为第一个的情况            self._head = cur.next        while cur.next:            pre = cur            cur = cur.next            if cur.item == item:                pre.next = cur.next

    def search(self, item):        """        查找节点是否存在        :param item:        :return:        """        cur = self._head        while None != cur:            if cur.item == item:                return True            cur = cur.next        return False

依此类推,我们可以像列表的方法一下来实现节点的方法,比如还可以设置查找索引,修改节点值等方法,这种数据数据结构和列表使用方法一样,只不过列表是python内部已经实现了相关的方法,如果要在python中使用链表,那么我们应该编写自己的链表数据结构,导入即可使用。

完整源码见下:

class Node:    def __init__(self, item):        self.item = item  # 该节点值        self.next = None   #  连接一下一个节点

class SinglyLinkedList:    """链表对象"""    def __init__(self):        self._head = None

    def add(self, item):        """        头部添加节点        :param item: 节点值        :return:        """        node = Node(item)        node.next = self._head        self._head = node

    def append(self, item):        """        尾部添加节点        :param items:        :return:        """        cur = self._head        if not cur:  # 判断是否为空链表            self.add(item)        else:            node = Node(item)            while cur.next:                cur = cur.next            cur.next = node

    @property    def is_empty(self):        """        判断链表是否为空,只需要看头部是否有节点        :return:        """        if self._head:            return False        else:            return True

    @property    def length(self):        """        获取链表长度        :return:        """        cur = self._head        n = 0        if not cur:            return n        else:            while cur.next:                cur = cur.next                n += 1            return n+1

    def ergodic(self):        """        遍历链表        :return:        """        cur = self._head        if not cur:            print('None')        else:            while cur.next:                print(cur.item)                cur = cur.next            print(cur.item)

    def insert(self, index, item):        """        在指定位置插入节点(设置索引从0开始)        :param item:        :return:        """        if index == 0:  # 当索为0则头部插入            self.add(item)        elif index >= self.length:  # 当索引超范围则尾部插入            self.append(item)        else:  # 找到插入位置的上一个节点,修改上一个节点的next属性            cur = self._head            n = 1            while cur.next:                if n == index:                    break                cur = cur.next                n += 1            node = Node(item)            node.next = cur.next            cur.next = node

    def deltel(self, item):        """        删除节点        :param item:        :return:        """        if self.is_empty:  # 节点为空的情况            raise ValueError("null")        cur = self._head        pre = None  # 记录删除节点的上一个节点        if cur.item == item:  # 当删除节点为第一个的情况            self._head = cur.next        while cur.next:            pre = cur            cur = cur.next            if cur.item == item:                pre.next = cur.next

    def search(self, item):        """        查找节点是否存在        :param item:        :return:        """        cur = self._head        while None != cur:            if cur.item == item:                return True            cur = cur.next        return False

python 判断div 之间的内容是否为空_python实现单向链表数据结构及其基本方法相关推荐

  1. python 判断div 之间的内容是否为空_python实现数据结构与算法之双端队列实现

    简介 双端队列(deque, double-ended queue),是一种具有队列和栈的性质的数据结构.双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行.双端队列可以在队列任意一端 ...

  2. python判断一个文件夹里面是否为空_Python碎片化学习教程 @8. 判断目标文件夹是否为空...

    代码功能:判断目标文件夹是否为空 代码如下:import os  # 导入负责处理操作系统相关事务的os模块 tar_dir = "D:\\666"  # 指定目标文件夹 if l ...

  3. jquery获取div/div之间的内容.text() 和 .html()区别

    jQuery 获取 div 之间的内容,有两种方法,$(selector).text().$(selector).html() . html: <div> <p>test< ...

  4. python判断相同,Python判断两个文件是否相同与两个文本进行相同项筛选的方法

    python判断两个文件是否相同 import hashlib def gethash(f): line=f.readline() hash=hashlib.md5() while(line): ha ...

  5. python判断一个列表是否包含另一个列表_Python判断一个list中是否包含另一个list全部元素的方法分析...

    Python判断一个list中是否包含另一个list全部元素的方法分析 本文实例讲述了Python判断一个list中是否包含另一个list全部元素的方法.分享给大家供大家参考,具体如下: 你可以用fo ...

  6. python判断三条边是否构成三角形代码_Python判断三段线能否构成三角形的代码

    我就废话不多说了,还是直接看代码吧! #!/usr/bin/env python3 #coding = utf-8 def is_triangle(a=0, b=0, c=0): #abc 三条边长 ...

  7. 程序语言python判断今天是今年的第几天_python怎么判断当前日期是今年的第几天...

    用Python判断某天是当年的第几天,可以用 datetime.timedelta.days 轻松提取天数.看下面的代码import datetime y = int(input('请输入4位数字的年 ...

  8. 输出101到200的素数python_使用python判断101-200之间有多少个素数,并输出所有素数分别是哪些a?...

    展开全部 判断素数的方法bai:用一个du数分别去除zhi2到sqrt(这个数),如果能dao被整除,则表明此版数不是素数,反权之是素数. 程序源代码: #!/usr/bin/python # -*- ...

  9. python判断两个列表内容是否一致_检查两个列表在Python中是否相同

    在python数据分析中,当我们需要比较两个列表并找出它们是否具有相同元素或没有相同含义时,我们可能会遇到这种情况. 例题listA = ['Mon','Tue','Wed','Thu'] listB ...

最新文章

  1. appscan无法连接到服务器_SQL Server无法连接服务器
  2. 【数字信号处理】相关函数 ( 能量信号 | 能量信号的互相关函数 | 能量信号的自相关函数 )
  3. “java程序打成jar包 如何处理第三方jar包”
  4. sql server数据库查询超时报错
  5. AtCoder Beginner Contest 177总结
  6. 使用Selenium Webdriver进行全屏截图
  7. runtime—新手必学
  8. 【Kafka】Kafka Schema Registry 原理
  9. python 修改列名_请教一个 Python 技巧(批量对 pandas.DataFrame()统一修改列名)
  10. 纽交所发言人就“GME事件”表态:采用先进技术监督市场
  11. python语言能做什么-python语言到底可以做什么呢?
  12. 非参数分析-符号秩和检验法
  13. mtk刷机工具sp flash tool_qpst刷机(翻到高中刷机时的记录,想来qpst对现在玩机的人也有用吧...
  14. 免费邮箱怎么注册?创建注册邮箱帐号免费吗?
  15. 股票交易接口api的协议
  16. Layman数字土地指南
  17. 面向对象分析与设计——ATM系统词汇表
  18. dellr320故障_用于对 PowerEdge 服务器进行高级故障处理的诊断工具
  19. 分布式发号器架构设计
  20. ffmpeg常用库、术语、API、数据结构总结

热门文章

  1. 研究partner determination的逻辑能否抽出来,以API的形式被我们Odata service implementation code里调用?
  2. 如何解决CMST_SI_PARTNER_PART_EXEC missing问题
  3. SAP S/4HANA销售订单的类型建模细节
  4. 使用postman和SAP C4C OData服务创建销售订单
  5. JavaScript的语音识别
  6. 到底哪种类型的错误信息会阻止business transaction的保存
  7. axios如何在nodejs项目里封装_【面经】jq 中 ajax 和 axios 区别,瀑布流布局,添加删除事件...
  8. 【linux】服务器运维必备之linux常用命令合集
  9. mysql登录之后可以写什么_MYSQL登陆完之后如何操作???(新手求助)
  10. UE4学习-自定义角色的移动、视野旋转、设置游戏模式