当前位置: 首页 > news >正文

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,next=None):self.element=element# 元素self.next=next# 指针classMyLinkedList:def__init__(self):self.__head=Noneself.__size=0# 返回链表中元素个数@property# 有它,外面访问size可以是 xx.size,没有它,外部访问size必须是 xx.size()defsize(self):returnself.__size# 判断链表是否为空defisEmpty(self):returnself.__size==0# 在指定位置插入元素definsert(self,index,element):# 第一步:检查index的合法性,合理的范围[0,self.__size]ifindex<0orindex>self.__size:raiseIndexError(f'{index}越界了')# 第二步: 创建新结点new_node=Node(element)# 创建新结点,此时新节点的next是Noneifindex==0:# 如果插入位置是0,需要单独谈论new_node.next=self.__head self.__head=new_nodeelse:# 第三步:根据index导航到对应的节点node=self.__head# 整个节点foriinrange(index-1):node=node.next# 经过这个循环,node最后指向 index 的前一个元素# 第四步:让新结点的next指向原来[index]位置的结点,[index]前一个结点的next指向新结点new_node.next=node.nextnode.next=new_node# 第五步:元素个数增加self.__size+=1# 在末尾插入元素defappend(self,element):# 第一步:遍历到尾结点node=self.__head# 第二步,创建新结点new_node=Node(element)# 修复:增加空链表的防御性判断ifself.__headisNone:self.__head=new_nodeelse:whilenode.nextisnotNone:node=node.next# 出了循环,node.next = None,说明是尾结点# 第三步,尾部追加元素node.next=new_node# 第四步:个数+1self.__size+=1# 删除指定位置的元素defremove(self,index):# 第一步:检查index的合法性,合理的删除范围[0,self.__size-1],检查index是否在已有元素的下标范围self.check_exsit_index(index)ifindex==0:# 头结点self.__head=self.__head.nextelse:# 第二步:根据index导航到[index-1]的结点node=self.find_element(index-1)# 经过这个循环,node最后指向的是index前一个结点# 第三步:要记录[index]位置的结点remove_node=node.next# 第四步:让node.next指向node的next.next结点# remove_node 是[index]位置的结点# node 是[index-1]位置的结点# remove_node的next是[index+1]位置的结点node.next=node.next.next# 第五步:[index]位置的结点的next和element都应该置空remove_node.element=Noneremove_node.next=None# 第六步:个数-1self.__size-=1# 合法检查:index是否在已有元素下标的合法范围内defcheck_exsit_index(self,index):# 是否index在已有元素的下标范围ifindex<0orindex>=self.__size:raiseIndexError(f"{index}越界了")# 修改指定位置的元素defset(self,index,element):# 第一步:检查index是否在已有元素的下标范围内self.check_exsit_index(index)# 第二步: 导航到index的位置node=self.find_element(index)# 循环出来后,node最后指向index位置的结点# 第三步:替换[index]位置结点的元素node.element=element# 查找元素deffind_element(self,index)->Any:node=self.__headforiinrange(index):node=node.nextreturnnode# 获取指定位置的元素defget(self,index):self.check_exsit_index(index)# 第二步: 导航到index的位置node=self.find_element(index)returnnode.element# 查找链表中某个元素的位置deffind(self,element):index=-1node=self.__headwhilenodeisnotNone:index=index+1ifnode.element==element:returnindex node=node.nextreturn-1# _str__ 是一个非常实用的魔术方法(Magic Method),专门用来自定义对象的字符串表示形式。# 有它,可以打印出元素的值,否则只能打印出地址值def__str__(self):result=""# 遍历node=self.__headwhilenodeisnotNone:result+=str(node.element)result+="->"ifnode.nextelse""node=node.nextreturnresultdef__iter__(self):node=self.__headwhilenodeisnotNone:yieldnode.element node=node.next# 测试if__name__=='__main__':link=MyLinkedList()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=' ')
http://www.jsqmd.com/news/1303635/

相关文章:

  • 2026年8月大连市联通100M单宽带实测办理全流程 - 找卡家园
  • 2026年8月北海市广电200M融合宽带避坑指南一篇说透 - 找卡家园
  • 2026铝合金门楼靠谱服务商排行及相关联系方式一览 - 奔跑123
  • 从标清到AIGC仅差1个模型:省级广电媒资库智能标签化改造,准确率提升91.7%的关键路径
  • 2026年8月福建省莆田市移动单宽带怎么安装 - 找卡家园
  • H1 H6 标题 层级 内容 结构 SEO: 降低跳出率的秘诀:优化层次的4个实用技巧
  • 模型量化趋势——2025下半年从INT8到FP8到混合精度的演进方向
  • 智习室合作注意!2026年赚不赚钱看这3点
  • 2026 年新消息:安阳可靠的老茧鸡眼处理培训企业哪家强,别再花冤枉钱遭罪!这玩意儿竟能让人无痛搞定手足上的硬疙瘩,学会能省大笔治疗费-神化采耳修脚 - 企业推荐官【认证官方】
  • 可灵文字特效生成进阶三重门:基础→动态锚点→物理引擎模拟,95%用户卡在第二关
  • 百考通得力助手:助力每一份研究从良好开端走向卓越成果,让你少走弯路
  • 2026年国内龙门加工中心哪家好相关排行一览 - 奔跑123
  • 2026年8月滁州市移动500M融合宽带怎么选不踩坑_一篇说透 - 找卡家园
  • 2026年8月宝鸡市联通2000M融合宽带办理避坑攻略,实测分享 - 找卡家园
  • 如何让Kindle变身完美漫画阅读器:Kindle Comic Converter终极指南
  • 5分钟快速掌握GetQzonehistory:QQ空间历史说说完整导出终极指南
  • 【AI水彩画生成终极指南】:20年图像算法专家亲授5大核心参数调优秘技,97%新手3天出图
  • 选靠谱厂家必看!2026抚州锌钢铝合金百叶窗/通风防雨空调外机罩格栅网推荐锦锋诚南城黎川南丰崇仁乐安宜黄金溪资溪广昌工程金属百叶源头工厂!附外墙装饰场景参数指南 - 奋斗者888
  • 2026 年当下,昌邑比较好的发电机租赁优质厂家哪家好,小区突然停电急疯了人,这临时用电的靠谱法子你试过没?-裕鑫通达电力 - 行业甄选官
  • 5分钟完成QQ空间青春记忆永久备份的终极指南
  • Claude 4.8写不同类型小说的表现差异:科幻、言情、悬疑实测
  • 2026年最新!3款亲测好用的英语教学软件推荐
  • 七月技术栈复盘:对的决策、要重构的节点与八月路线
  • 2026探寻浙江靠谱滚塑模具厂家体验场景分享 - 奔跑123
  • 【JVM原理详解】26-Parallel-Scavenge与吞吐量优先
  • 2026年8月宝鸡市联通1000M融合宽带办理攻略 - 找卡家园
  • 2026年8月滁州市电信1000M融合宽带怎么安装 - 找卡家园
  • 盘点2026天津大型智能气瓶柜厂家公开排行内容 - 奔跑123
  • OBS背景移除插件终极指南:3分钟实现专业级虚拟背景
  • OpenCore Legacy Patcher终极指南:5步解决老Mac升级macOS新系统的完整操作方案