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 ElementTree 基本读操作示例
Apr 09 Python
Python编程实现粒子群算法(PSO)详解
Nov 13 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
Jan 05 Python
儿童python练习实例
May 27 Python
python实现linux下抓包并存库功能
Jul 18 Python
解决django中ModelForm多表单组合的问题
Jul 18 Python
如何实现Django Rest framework版本控制
Jul 25 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
使用darknet框架的imagenet数据分类预训练操作
Jul 07 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 Python
PyQt5 显示超清高分辨率图片的方法
Apr 11 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
PHP生成便于打印的网页
2006/10/09 PHP
php在线打包程序源码
2008/07/27 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
让你成为更出色的PHP开发者的10个技巧
2011/02/25 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
php自定义分页类完整实例
2015/12/25 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
浅谈JS运算符&amp;&amp;和|| 及其优先级
2016/08/10 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
2017/06/29 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
在Django同1个页面中的多表单处理详解
2017/01/25 Python
Java与Python两大幸存者谁更胜一筹呢
2018/04/12 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
Python求凸包及多边形面积教程
2020/04/12 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
挂牌仪式策划方案
2014/05/18 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
地道战观后感400字
2015/06/04 职场文书
刑事法律意见书
2015/06/04 职场文书
淮海战役观后感
2015/06/11 职场文书
股东出资协议书
2016/03/21 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python