python实现·数据结构与算法之单向链表

介绍Python中如何通过类和方法来实现链表数据结构,并且给出示例代码。 作者:禅与计算机程序设计艺术 1.简介 链表(Linked list)是一种线性数据结构,其元素可以按顺序存储在内存中。链表由节点组成,每个节点包含一个数据元素和指向下个节点的指针。链表中的第一个节点称作头结点,尾结点往往没有指针。另外,单向链表只能从头结点到尾结点方向遍历,双向链表既可从头到尾,又可从 阅读详情

单向链表定义

单向链表(Single Linked List)也叫单链表,是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素,是链表中最简单的一种形式。链表中的数据是以结点来表示的,每个节点包含两个域,一个元素域(数据元素的映象)和一个链接域,链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。

节点示意图

单向链表节点示意图

单向链表示意图

单向链表示意图

单向链表的基本操作

  • is_empty() 判断链表是否为空
  • length 链表长度
  • travel() 遍历整个链表,打印元素
  • add(item) 在链表头部添加元素
  • append(item) 在链表尾部添加元素
  • insert(pos, item) 在指定位置插入元素
  • remove(item) 删除元素
  • clear() 清空链表
  • is_contain(item) 判断元素是否存在

Python代码实现

# 节点的实现

class Node(object):
    """单链表的结点"""
    def __init__(self,item):
        # _item存放数据元素
        self.item = item
        # _next是下一个节点的标识
        self.next = None
# 单向链表的实现

class SingleLinkList(object):
    """单链表"""
    def __init__(self):
        self._head = None

    def is_empty(self):
        """判断链表是否为空"""
        return self._head is None

    @property
    def length(self):
        """链表长度"""
        # cur初始时指向头节点
        cur = self._head
        count = 0
        # 尾节点指向None,当未到达尾部时
        while cur is not None :
            count += 1
            # 将cur后移一个节点
            cur = cur.next
        return count

    def travel(self):
        """遍历链表"""
        cur = self._head
        while cur is not None :
            print(cur.item)
            cur = cur.next
        print("")
        
    def add(self, item):
        """头部添加元素"""
        # 先创建一个保存item值的节点
        node = Node(item)
        # 将新节点的链接域next指向头节点,即_head指向的位置
        node.next = self._head
        # 将链表的头_head指向新节点
        self._head = node
    
    def append(self, item):
        """尾部添加元素"""
        node = Node(item)
        # 先判断链表是否为空,若是空链表,则将_head指向新节点
        if self.is_empty():
            self._head = node
        # 若不为空,则找到尾部,将尾节点的next指向新节点
        else:
            cur = self._head
            while cur.next is not None :
                cur = cur.next
            cur.next = node
            
    def insert(self, pos, item):
        """指定位置添加元素"""
        # 若指定位置pos为第一个元素之前,则执行头部插入
        if pos <= 0:
            self.add(item)
        # 若指定位置超过链表尾部,则执行尾部插入
        elif pos > (self.length-1):
            self.append(item)
        # 找到指定位置
        else:
            node = Node(item)
            count = 0
            # pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置
            pre = self._head
            while count < (pos-1):
                count += 1
                pre = pre.next
            # 先将新节点node的next指向插入位置的节点
            node.next = pre.next
            # 将插入位置的前一个节点的next指向新节点
            pre.next = node
            
    def remove(self,item):
        """删除节点"""
        cur = self._head
        pre = None
        while cur is not None :
            # 找到了指定元素
            if cur.item == item:
                # 如果第一个就是删除的节点
                if not pre:
                    # 将头指针指向头节点的后一个节点
                    self._head = cur.next
                else:
                    # 将删除位置前一个节点的next指向删除位置的后一个节点
                    pre.next = cur.next
                break
            else:
                # 继续按链表后移节点
                pre = cur
                cur = cur.next
    
    def is_contain(self,item):
        """链表查找节点是否存在,并返回True或者False"""
        cur = self._head
        while cur is not None :
            if cur.item == item:
                return True
            cur = cur.next
        return False
    
    def __len__(self):
        """可以使用len()方法获取链表长度"""
        return self.length
    
    def __iter__(self):
        """可使用循环遍历链表里的元素"""
        cur = self._head
        while cur is not None:
            value = cur.item
            cur = cur.next
            yield value
    
    def __contains__(self, item):
        """可使用in判断是否在链表中"""
        cur = self._head
        while cur is not None :
            if cur.item == item:
                return True
            cur = cur.next
        return False
# 测试数据

if __name__ == '__main__':
    print("--------创建单向链表---------")
    sl_list = SingleLinkList()
    sl_list.add(1)
    sl_list.add(2)
    sl_list.append(3)
    sl_list.insert(2, 4)
    print("length:",len(sl_list))
    sl_list.travel()
    print(sl_list.is_contain(3))
    print(sl_list.is_contain(5))
    print(3 in sl_list)
    print(5 in sl_list)
    sl_list.remove(1)
    print("length:",len(sl_list))
    sl_list.travel()
    print("--------循环遍历-------")
    for i in sl_list:
        print(i)
# 输出结果

--------创建单向链表---------
length: 4
2
1
4
3

True
False
True
False
length: 3
2
4
3

--------循环遍历-------
2
4
3

算法分析

操作复杂度
访问元素 O ( n ) O(n) O(n)
在头部插入/删除 O ( 1 ) O(1) O(1)
在尾部插入/删除 O ( n ) O(n) O(n)
在中间插入/删除 O ( n ) O(n) O(n)

联系我们

个人博客网站:http://www.bling2.cn/

Github地址:https://github.com/lb971216008/Use-Python-to-Achieve

知乎专栏:https://zhuanlan.zhihu.com/Use-Python-to-Achieve

小专栏:https://xiaozhuanlan.com/Use-Python-to-Achieve

博客园:https://www.cnblogs.com/Use-Python-to-Achieve
关注微信公众号【不灵兔】,获取更多资料

Python | KS检验以及其余非参数检验的实现 Python | KS检验以及其余非参数检验的实现1 什么是KS检验2 KS检验分类?3 KS检验的Python实现3.1 检验指定的数列是否服从正态分布3.2 检验指定的两个数列是否服从相同分布4 其余的非参数检验4.1 Wilcoxon符号秩检验(t检验的非参数版本)4.2 Kruskal-Wallis H检验(方差分析的非参数版本)4.3 Mann-Whitney秩检验5 参考 1 什么是KS检验 定义:检验一个分布f(x)与理论分布g(x)【比如正态分布】是否一致,或两个观测值分布是否有显著差异的检 阅读详情

相关推荐

VBA中如何使用Edge内核Browser?

在微软宣布停止对IE的支持后,许多使用VBA中Web Browser的用户遇到了困境,因为Web Browser使用的IE内核。然而微软并没有给出支持Edge的新版Web Browser,网上许多第三方的库也不够完善。经过调研,libEdge可以较好的和VBA集成,实现在Excel中打开Browser,甚至能够通过执行js代码,获取web页面的信息。项目需要WebView2Loader.dll和LibEdge.dll两个库,区分x86和x64版本。

金木AI 2398

java List 循环删除/添加

结论: 1、删除时: 方案一:利用iterator,详见如下 方案二: for循环倒序进行删除 2、添加时 利用for循环进行添加。不能使用iterator 删除案例 java.util.List<String> list=new ArrayList(); list.add("aa"); list.add("bb"); list.add("bb");// 注意,要有多个bb list.add("cc"); 将list中的“鹿晗”删除掉 案例来自: HBase2.1.

weixin_49820634的博客 4668

微弱电流检测放大器PCB布线布局设计

微弱电流检测放大器PCB布线布局设计的注意事项,保护环的概念和相关设计。

ydgd118的博客 1万+

python中的列表list

列表 是一种用于保存一系列有序项目的集合,也就是说,你可以利用列表保存一串项目的序列。想象起来也不难,你可以想象你有一张购物清单,上面列出了需要购买的商品,除开在购物清单上你可能为每件物品都单独列一行,在 Python 中你需要在它们之间多加上一个逗号。 项目的列表应该用方括号括起来,这样 Python 才能理解到你正在指定一张列表。一旦你创建了一张列表,你可以添加、移除或搜索列表中的项目。既然我...

小小少年eason的博客 393

ISP图像处理Verilog仿真框架搭建(附代码)

基于Verilog的图像处理仿真框架搭建

路漫漫其修远兮,吾将上下而求索 1898

用ADS2023手把手仿真SKYWORKS SMA1234变容二极管:从Datasheet到S参数结果全流程

本文详细介绍了如何使用ADS2023仿真SKYWORKS SMA1234变容二极管的全流程,从Datasheet参数解析到S参数结果验证。通过等效电路建模、关键公式编写和仿真设置,帮助工程师掌握变容二极管在射频电路设计中的应用技巧,提升仿真精度和工程实践能力。

weixin_29233333的博客 502

ArrayList关于for循环插入数据,数据量较大优化加快执行效率的方法

public static void main(String[] args) { final int N=10000; Object obj=new Object(); ArrayList list1=new ArrayList(); long start=System.currentTimeMillis(); fo...

莫哈的博客 8818

kaggle竞赛平台上数据集下载详解

从kaggle 网站上下载数据集既保证了速度又避免了网络的不稳定造成下载失败问题。该平台也可以上传代码作为自己的代码库,不过本人更习惯将代码上传到github上。希望本人整理的kaggle库使用技巧能够帮助到正在阅读本博客的你。此外还有一篇博客针对kaggle数据集下载问题的几个问题的相关文章进行了整理【博客链接】。

li1784506的博客 2万+

【数据结构与算法】python实现单向链表及操作

python快速实现单向链表及其操作

weixin_43911004的博客 3227

《一》:LBE,VR 大空间系列——场景环境需求解析

当前,大量 VR 体验活动在室内场地开展。因此,对于场地照明有特定要求:除天花板外,场地的所有表面均需有照明覆盖。这是为了保证玩家无论处于场地的哪个位置,地面与墙面都不会出现明显的影子。场地内不建议安装射灯或高强度的点光源,若已安装此类灯具,需使用柔光板进行遮盖。此外,要避免在阳光下使用 VR 设备台。参考图(请忽略其中Maker标签)

unitygroup的博客 944

【跳频通信】基于MATLAB的跳频通信系统仿真

同时,跳频通信也具有良好的抗干扰能力,即使有部分频点被干扰,仍能在其他未被干扰的频点上进行正常的通信。由于跳频通信系统是瞬时窄带系统,它易于与其他的窄带通信系统兼容,也就是说,跳频电台可以与常规的窄带电台互通,有利于设备的更新。跳频是最常用的扩频方式之一,其工作原理是指收发双方传输信号的载波频率按照预定规律进行离散变化的通信方式,也就是说,通信中使用的载波频率受伪随机变化码的控制而随机跳变。从通信技术的实现方式来说,“跳频”是一种用码序列进行多频频移键控的通信方式,也是一种码控载频跳变的通信系统。

FPGA/MATLAB学习教程/源码/项目合作开发 6267

python实现合并链表_Python实现数据结构与算法之单向链表

单向链表定义单向链表(Single Linked List)也叫单链表,是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素,是链表中最简单的一种形式。链表中的数据是以结点来表示的,每个节点包含两个域,一个元素域(数据元素的映象)和一个链接域,链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。节点示意图单向链表节点示意图表元素域elem用来存放具体的数...

weixin_35600369的博客 397

1 电科院FTU检测标准学习笔记-外观检查

作者简介:本人从事电力系统多年,岗位包含研发,测试,工程等,具有丰富的经验在配电自动化验收测试以及电科院测试中,本人全程参与,积累了不少现场的经验。

sixtome 1852

c4.5算法python实现_Python实现数据结构与算法之单向链表

单向链表定义单向链表(Single Linked List)也叫单链表,是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素,是链表中最简单的一种形式。链表中的数据是以结点来表示的,每个节点包含两个域,一个元素域(数据元素的映象)和一个链接域,链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。节点示意图单向链表节点示意图表元素域elem用来存放具体的数...

weixin_39785723的博客 104

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

list循环添加数据_Python 实现·数据结构与算法之单向链表

单向链表定义 单向链表(Single Linked List)也叫单链表,是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素,是链表中最简单的一种形式。链表中的数据是以结点来表示的,每个节点包含两个域,一个元素域(数据元素的映象)和一个链接域,链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。节点示意图 单向链表示意图 单向链表的基本操作 is_empty(...

weixin_39732316的博客 135

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据结构与算法:Python实现单向链表与单向循环链表

题目单向链表单向循环链表 单向链表 # encoding=utf-8 """ Date:2019-07-06 16:11 User:LiYu Email:liyu_5498@163.com """ class Node(object): def __init__(self, element): self.element = element self.n...

Dreaming5498的博客 435

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python算法与数据结构004--单向链表的实现

单向链表:每一个节点保存自己的数据和一个next变量指向下一个节点。链表本身只需要存取表头即可。 class Node(object): """链表节点""" def __init__(self,data,next=None): self.data = data self.next = next class SingleLinkedList...

youran02100210的专栏 221

python 单向链表实现快速排序_Python实现数据结构线性链表(单链表)算法示例...

本文实例讲述了Python实现数据结构线性链表(单链表)算法。分享给大家供大家参考,具体如下:初学python,拿数据结构中的线性链表存储结构练练手,理论比较简单,直接上代码。#!/usr/bin/python# -*- coding:utf-8 -*-# Author: Hui# Date: 2017-10-13# 结点类,class Node:def __init__(self, data)...

weixin_39622905的博客 282

python的线性链表_数据结构和算法的Python描述,与,单向,线性,链表,简介,及其,实现...

通过文章:我们深入探究了Python中list类基于数组实现的本质。后续在以下两篇文章:我们又通过将list类的实例作为元素存储容器实现了栈、队列、双端队列等基本数据结构的ADT。虽然Python的list类已经过高度优化了,但是其作为元素存储容器依然有如下显著问题:列表的长度可能大于栈、队列、双端队列中的元素个数;列表底层基于数组实现,其append(e)和pop(0)操作经摊销后的时间复杂度才...

weixin_39611666的博客 141

用python手撸单向链表

本文介绍了单向链表的模拟实现方法。首先定义了节点类Node,包含数值域item和地址域next。然后定义了单链表类SingleLinkList,实现了链表的基本操作:判断空链表、获取长度、遍历链表,以及添加元素(头部add、尾部append、指定位置insert)和删除元素remove等方法。最后通过测试代码演示了链表的创建和操作过程,包括添加多个节点、在指定位置插入节点以及删除特定节点等操作。文章提供了完整的Python实现代码,可作为链表数据结构的参考实现。

2301_76243776的博客 198

数据结构与算法(四):Python实现单链表的反转、环的检测、两个有序链表的合并、判断单向链表是否是回文字符串

单链表的反转、环的检测、两个有序链表的合并、判断单向链表是否是回文字符串

AI数据工厂 379

c++使用单向链表存储一组有序数据_数据结构与算法

博客文章地址:一、数据结构与算法 - Norni - 博客园​www.cnblogs.com一、数据结构和算法基础1.算法的概念算法是独立存在的一种解决问题的方法和思想算法的五大特性:输入:算法具有0个或多个输入输出:算法至少有1个或多个输出有穷性:算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成确定性:算法中的每一步都有确定的含义,不会出现二义性可行性:算法的...

weixin_32569115的博客 838

python 单向链表_01_单向链表的基本用法[Python]

1. 数据结构与算法想起班级拍毕业合照的时候,摄影师让喊口号,于是乎大家从C、C++、Java、Python、Go、R,一直喊了个遍。程序语言有很多,但数据结构和算法的思维是根本所在。程序 = 数据结构 + 算法总结:算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体。数据结构只是静态的描述了数据元素之间的关系。高效的程序需要在数据结构的基础上设计和选择算法。2. 时间复杂度与Pyt...

weixin_39987985的博客 196

python数据结构与算法系列

python数据结构与算法系列 链表 我们之前介绍了顺序表的相关内容,了解到如果要构建顺序表就需要知道数据的大小,然后再申请存储空间,而且在扩充时也需要进行数据搬迁,使用起来很不方便。 因此我们引入链表的概念,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。 链表是一种常见的基础数据结构,是一种线性表,但其存储数据的方式与顺序表不同,链表是在每个节点里存放下一个节点的位置信息,如下图所示。 单向链表 单向链表又称单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)

HoriZon1998的博客 117

python链表怎么定义_码哥聊Python数据结构--链表

前几天我们开了个数据结构的坑,说了栈,留言里有同学提到链表,那今天码哥就来讲讲链表。链表是什么链表、列表,说起来有点相似,作用也有点类似,但可别傻傻分不清楚。我们一般说的列表,是一个连续的序列,用来存储一组数据。而链表,虽然也是有序的存储结构,但它不限定要“连续”的。打个比方:列表就好像火车,每一节车厢连在一起,如果你知道车头在哪里,大致就也能知道第8节车厢在哪。而链表,就像是去往同个目的地的车队...

weixin_39598135的博客 277
上一篇: python实现·十大排序算法之桶排序(Bucket Sort)
下一篇: python实现·数据结构与算法之单向循环链表
南风以南
博客等级 码龄10年 440粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南风以南

如给您带来些许明朗,赏一杯香茗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值