python单向链表实例详解


Posted in Python onMay 25, 2022

使用python实现单向链表,供大家参考,具体内容如下

单向链表:是将所有的数据作为一个个节点,将所有的节点链接在一起。每一个节点中又分为: 存储数据区,链接区

存储数据区: 存储具体的数据

链接区: 指向下一个节点

分析实现:

1、 分析:根据链表的特性,首先要存放有数据的容器,还要有存放节点的容器
2、 节点类中:要有数据区和next区
3、 链表类中:存放所有节点

单链表操作

1、链表是否为空
2、链表的长度
3、遍历链表
4、链表头部添加元素
5、链表尾部添加元素
6、链表指定位置添加元素
7、链表删除节点
8、查找节点是否存在

代码实现

# Functions  函数声明
class Node():
    """
    存放节点类
    每次调用该类,实例化一个节点
    默认每个节点中有数据区,next区。
    数据区为该数据,next区为空
    """
    def __init__(self, item,next=None):
        self.item = item
        self.next = next
        pass

class Linklist():
    """
    存放数据类
    将所有的节点存放起来的容器
    首先,默认链表为空,在这里需要有一个头节点,默认头节点为空

    """
    def __init__(self, head=None):
        self.head = head

    def is_empty(self):
        return self.head == None

    def append(self, item):
        """
        往链表尾部添加数据
        1、实例化游标:使用游标指向每一个数据,检索数据和判断数据next是否为空
        2、移动游标,从头节点开始,每次使用self.next移动,以为next指向的就是下一个数据
        3、添加数据,首先判断链表是否为空,为空的情况下,直接将头节点等于node数据
        4、如果不为空,需要从头节点开始,移动游标,判断游标指向的next是否为空
        5、使用循环不停的移动节点,当遇到节点中的next为空的情况下停止移动
        6、循环条件: 当 条件 != None, 进入循环获取,当cur为空时就不会进入循环,所以在这里要使用 cur != None
        """
        # 首先要实例化一个节点
        node = Node(item)
        # 如果链表为空
        if self.is_empty():
            # 直接将头节点的next添加node
            self.head = node
        else:
            # 实例化一个游标
            cur = self.head
            while cur.next != None:
                # 移动游标,得到最后一个游标的数据
                cur = cur.next
            # 将移动后的数据的下一个next添加上 node
            cur.next=node
            pass

    def travel(self):
        """遍历数据"""
        # 实例化一个游标
        cur = self.head
        # 数据链为空的情况
        if self.is_empty():
            print('')
        else:
            # 获取每个数据区中的数据
            # 移动游标,每移动一次,输出一次数据区内的数据
            while cur != None:
                print(cur.item, end=' ')
                cur = cur.next
            print()

    def length(self):
        """返回链表的长度"""
        # 实例化游标
        cur = self.head
        # 计数,这里对空链表进行判断,如果是链表,则不会进入循环,直接输出 0
        count = 0
        # 移动游标,获取下一个数据,然后让count +=1
        while cur != None:
            # 计数
            count+=1
            # 移动游标
            cur = cur.next
        return count

    def add(self, item):
        """
        头部添加数据
        分析: 将数据添加到第一个节点当中
        1、 需要先将node的next指向 原第一个节点,这原第一个节点就是self.head
        2、 再讲self.head指向node进行连接
        """
        # 先实例化节点
        node = Node(item)
        # 将数据添加到头部当中
        node.next=self.head
        self.head=node

    def insert(self, index, item):
        """
        指定位置添加数据
        分析:
        1、首先要找到,该位置的数据
        2、将要添加的数据next等于 原位置的next数据
        3、原数据的 next等于node新数据
        """
        if index<=0:
            # 如果输入的索引小于或者等于O,默认使用头插发
            self.add(item)
        elif index>self.length():
            # 如果输入的索引大于链表的长度,使用尾插法
            self.append(item)
        else:
            # 实例化数据节点
            node = Node(item)
            # 找到该数据的位置
            # 实例化一个游标
            cur = self.head
            # 计数
            conent = 0
            while conent<(index-1):
                conent+=1
                cur = cur.next

            node.next=cur.next
            cur.next=node

    def search(self, item):
        """
        查询指定的数据是否存在
        分析: 查询指定的数据,需要对整个链表扫描,判断这个数据是否等的该节点中的数据
        """
        # 实例化一个游标
        cur = self.head
        # 进行判断是否相等
        while cur != None:
            # 判断
            if cur.item == item:
                return True
            else:
                cur = cur.next
            pass
        # 否则返回False
        return False

    def remove(self, item):
        """
        移除指定的数据
        分析:
        1、删除数据,需要首先判断数据是否存在
        2、找到该数据所在的位置,将该数据的上一个数据的next指向自己的next
        3、如何获取该数据的指向,和上一个数据的指向
        4、需要定义两个指针
        5、先将两个指针相等,再讲一个指针先移动一次,再同时移动

        """
        # 先找到该数据
        cur = self.head
        por = None

        while cur != None:
            if cur.item==item:
                # 要判断是否为第一个节点
                if cur == self.head:
                    self.head = cur.next
                else:
                    por.next = cur.next
                break
            else:
                # 如果在当前节点中没有相等的,将节点进行移动
                # 移动要注意,现将两个游标相等,再讲另一个游标移动一次
                por = cur
                cur = cur.next

测试运行

# 程序的入口
if __name__ == "__main__":
    s = Linklist()
    s.append(100)
    s.append(200)
    s.append(300)
    s.add(1)
    s.add(12)
    s.insert(-1,6)
    
    s.travel()       #  6 12 1 100 200 300 
    print(s.length())  # 6
    print(s.search(11)) # False
    s.remove(12)
    s.travel()       # 6 1 100 200 300 
    print(s.length())  # 5
    print(s.search(11)) # False
    pass

以上就是本文的全部内容,希望对大家的学习有所帮助。


Tags in this post...

Python 相关文章推荐
Python的加密模块md5、sha、crypt使用实例
Sep 28 Python
用Python进行TCP网络编程的教程
Apr 29 Python
Django中处理出错页面的方法
Jul 15 Python
python处理html转义字符的方法详解
Jul 01 Python
Pycharm+Scrapy安装并且初始化项目的方法
Jan 15 Python
Python中的元组介绍
Jan 28 Python
详解python校验SQL脚本命名规则
Mar 22 Python
python 比较2张图片的相似度的方法示例
Dec 18 Python
如何基于Python实现数字类型转换
Feb 07 Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 Python
利用Opencv实现图片的油画特效实例
Feb 28 Python
python 多态 协议 鸭子类型详解
Nov 27 Python
利用Python实现模拟登录知乎
May 25 #Python
python双向链表实例详解
May 25 #Python
Python实现双向链表基本操作
May 25 #Python
python实现双向链表原理
May 25 #Python
Python代码实现双链表
详解NumPy中的线性关系与数据修剪压缩
python实现双链表
May 25 #Python
You might like
Yii2中事务的使用实例代码详解
2016/09/07 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
Javascript 面向对象 重载
2010/05/13 Javascript
jquery ui dialog ie8出现滚动条的解决方法
2010/12/06 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
Node.js编程中客户端Session的使用详解
2015/06/23 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
2015/08/28 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
django框架单表操作之增删改实例分析
2019/12/16 Python
python识别验证码图片实例详解
2020/02/17 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
自我评价正确写法范文
2013/12/10 职场文书
优秀求职信范文分享
2013/12/19 职场文书
报到证丢失证明
2014/01/11 职场文书
高二物理教学反思
2014/02/08 职场文书
党员先锋岗事迹材料
2014/05/08 职场文书
安全责任书怎么写
2014/07/28 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
工程质检员岗位职责
2015/04/08 职场文书
廉政党课工作报告案例
2019/06/21 职场文书