尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
03_单链表的实现
2、链表的功能定义方法说明size()返回链表中元素个数is_empty()判断链表是否为空insert(index, item)在指定位置插入元素append(item)在末尾插入元素remove(index)删除指定位置的元素set(index, item)修改指定位置的元素get(index)获取指定位置的元素find(item)查找链表中某个元素的位置__str__()返回字符串 [元素1, 元素2, 元素3]__iter__()返回迭代器对象在这里插入代码片# 定义节点fromtypingimportAnyfromenvs.nlp.Lib.unittestimportresultclassNode:def__init__(self,element,nextNone):self.elementelement# 元素self.nextnext# 指针classMyLinkedList:def__init__(self):self.__headNoneself.__size0# 返回链表中元素个数property# 有它外面访问size可以是 xx.size,没有它外部访问size必须是 xx.size()defsize(self):returnself.__size# 判断链表是否为空defisEmpty(self):returnself.__size0# 在指定位置插入元素definsert(self,index,element):# 第一步检查index的合法性合理的范围[0,self.__size]ifindex0orindexself.__size:raiseIndexError(f{index}越界了)# 第二步: 创建新结点new_nodeNode(element)# 创建新结点此时新节点的next是Noneifindex0:# 如果插入位置是0需要单独谈论new_node.nextself.__head self.__headnew_nodeelse:# 第三步根据index导航到对应的节点nodeself.__head# 整个节点foriinrange(index-1):nodenode.next# 经过这个循环node最后指向 index 的前一个元素# 第四步让新结点的next指向原来[index]位置的结点[index]前一个结点的next指向新结点new_node.nextnode.nextnode.nextnew_node# 第五步元素个数增加self.__size1# 在末尾插入元素defappend(self,element):# 第一步遍历到尾结点nodeself.__head# 第二步创建新结点new_nodeNode(element)# 修复增加空链表的防御性判断ifself.__headisNone:self.__headnew_nodeelse:whilenode.nextisnotNone:nodenode.next# 出了循环,node.next None说明是尾结点# 第三步尾部追加元素node.nextnew_node# 第四步个数1self.__size1# 删除指定位置的元素defremove(self,index):# 第一步检查index的合法性合理的删除范围[0,self.__size-1],检查index是否在已有元素的下标范围self.check_exsit_index(index)ifindex0:# 头结点self.__headself.__head.nextelse:# 第二步根据index导航到[index-1]的结点nodeself.find_element(index-1)# 经过这个循环node最后指向的是index前一个结点# 第三步要记录[index]位置的结点remove_nodenode.next# 第四步让node.next指向node的next.next结点# remove_node 是[index]位置的结点# node 是[index-1]位置的结点# remove_node的next是[index1]位置的结点node.nextnode.next.next# 第五步[index]位置的结点的next和element都应该置空remove_node.elementNoneremove_node.nextNone# 第六步个数-1self.__size-1# 合法检查index是否在已有元素下标的合法范围内defcheck_exsit_index(self,index):# 是否index在已有元素的下标范围ifindex0orindexself.__size:raiseIndexError(f{index}越界了)# 修改指定位置的元素defset(self,index,element):# 第一步检查index是否在已有元素的下标范围内self.check_exsit_index(index)# 第二步 导航到index的位置nodeself.find_element(index)# 循环出来后node最后指向index位置的结点# 第三步替换[index]位置结点的元素node.elementelement# 查找元素deffind_element(self,index)-Any:nodeself.__headforiinrange(index):nodenode.nextreturnnode# 获取指定位置的元素defget(self,index):self.check_exsit_index(index)# 第二步 导航到index的位置nodeself.find_element(index)returnnode.element# 查找链表中某个元素的位置deffind(self,element):index-1nodeself.__headwhilenodeisnotNone:indexindex1ifnode.elementelement:returnindex nodenode.nextreturn-1# _str__ 是一个非常实用的魔术方法Magic Method专门用来自定义对象的字符串表示形式。# 有它可以打印出元素的值否则只能打印出地址值def__str__(self):result# 遍历nodeself.__headwhilenodeisnotNone:resultstr(node.element)result-ifnode.nextelsenodenode.nextreturnresultdef__iter__(self):nodeself.__headwhilenodeisnotNone:yieldnode.element nodenode.next# 测试if__name____main__:linkMyLinkedList()print(最初的size:,link.size)print(是否为空,link.isEmpty())link.insert(0,hello)link.insert(1,world)link.insert(2,!)link.insert(3,Life)link.insert(4,is)link.insert(5,wonderful)link.insert(6,.)print(现在的size:,link.size)print(是否为空:,link.isEmpty())print(link:,link)link.append(33)print(link:,link)link.remove(0)print(link:,link)link.remove(6)print(link:,link)link.remove(3)print(link:,link)link.set(3,score)print(link:,link)print(link.get(3))print(life的位置:,link.find(life))print(world的位置:,link.find(world))print(.的位置:,link.find(.))print(Life的位置:,link.find(Life))print(使用for循环遍历)foriteminlink:print(item,end )
RELATED

相关推荐

为什么92%的AI自动化项目半年内失效?避开这7个隐形陷阱,让重复劳动真正归零

为什么92%的AI自动化项目半年内失效?避开这7个隐形陷阱,让重复劳动真正归零

更多请点击: https://codechina.net 第一章:AI 减少重复劳动 人工智能正以前所未有的深度介入日常开发与运维流程,将工程师从大量机械性、模式化任务中解放出来。这类任务虽不复杂,却耗时易错——例如日志清洗、测试用例生成、AP…

📅 2026/9/25 5:41:06
GRE词汇记忆效率提升217%的AI协同法(基于fMRI验证的间隔重复+语义图谱双引擎)

GRE词汇记忆效率提升217%的AI协同法(基于fMRI验证的间隔重复+语义图谱双引擎)

更多请点击: https://intelliparadigm.com 第一章:AI准备GRE考试的范式革命 传统GRE备考依赖线性刷题、静态资料与固定时间表,而新一代AI系统正以动态认知建模、实时能力诊断与自适应路径生成重构整个学习范式。AI不再仅是“解题助手”&…

📅 2026/8/22 15:42:06
构建智能散热系统:深入探索FanControl的精准风扇控制技术

构建智能散热系统:深入探索FanControl的精准风扇控制技术

构建智能散热系统:深入探索FanControl的精准风扇控制技术 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…

📅 2026/9/8 10:38:14
MORE NEWS

更多资讯

📰

带补偿与爬坡约束的电力市场混合整数均衡问题精确求解方法

电力市场的出清计算,说白了就是在一个巨大的经济调度问题里找平衡点。这几年我做过不少相关的优化项目,最头疼的往往不是连续量的经济调度,而是那些带 0-1 整数变量的均衡问题。尤其当场景里再加上补偿费用、机组上升爬坡约束,问题…

📰

精益与六西格玛的本质区别及应用场景解析

1. 为什么我们需要分清精益与六西格玛上周和制造业的老王吃饭时,他提到公司刚花大价钱请了咨询公司做"精益六西格玛"培训,结果发现顾问自己都说不清两者的区别,把改善活动搞得一团糟。这让我想起十年前刚接触这两个方法论时踩过的坑…

📰

WinForms嵌入Word/Excel实现本地Office控件级集成

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Atlas 300V推理加速卡部署YOLO:从环境配置到性能优化全流程指南

1. 被问懵了:Atlas 300V 到底是不是一张"运算加速卡"前段时间有个做安防项目的朋友问我,手上的Atlas 300V 24G到底能不能用来跑训练,还说他在网上查资料看得云里雾里。这个问题我太熟悉了——刚接触昇腾(Ascend&#xf…

📰

Skia CanvasKit 构建与测试实战:从 emscripten 编译、本地调试到 Karma 测试与 WASM 性能验证

图形学图像处理 【免费下载链接】skia Skia is a complete 2D graphic library for drawing Text, Geometries, and Images. 项目地址: https://gitcode.com/gh_mirrors/skia1/skia 点击查看 免费下载 本篇指南基于仓库中 modules/canvaskit/README.md 展开&#x…

📰

【电路设计】常开和常闭开关/接触器 如何选?

在电路设计中经常碰见常开和常闭的开关或者接触器,本文将会简要按照我的理解说明一下常开,常闭的选择依据。常开常闭其实在正常的工况下没有什么过大的区别,但是在某些故障场景,常开和常闭就是非常重要的选择。常开:在…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬