当前位置: 首页 > 科技观察

Python数据结构之单链表

时间:2023-03-16 13:43:52 科技观察

本文转载请联系python与大数据分析公众号。今天终于明白了大学时候想都没想过的链表数据结构。收获不小,还挺好玩的。文末附上链表操作示意图。单向链表(singlelinkedlist)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问从头部开始,顺序读取。单链表是一种链式访问数据结构,它使用一组任意地址的存储单元来存储线性表中的数据元素。链表中的数据由节点表示。每个节点的组成是:元素(数据元素的图像)+指针(表示后续元素的存储位置)。元素是存储数据的存储单元,指针是连接各个节点的地址数据。它的每个节点都包含两个域,一个信息域(元素域)和一个链接域。此链接指向链表中的下一个节点,最后一个节点的链接字段指向空值。isempty(self)链表是否为空length(self)链表的长度travel(self)遍历整个链表add(self,item)向链表头部添加元素append(self,item)向链表尾部添加元素insert(self,item,index)在指定位置添加元素deletebyitem(self,item)根据数据项删除节点deletebyindex(self,index)根据数据项删除节点索引位置search(self,item)根据数据项查找节点是否存在update(self,index,item)暂无实现getitem(self,index)获取索引位置对应的数据项getindex(self,item)获取数据项对应的索引位置代码基本是原创的,经过大量改写returnstr(self.item)classSingleLinkList(object):def__init__(self):self.header=Noneself.currentnum=0defisempty(s精灵):returnsself.header==Nonedeflength(self):returnsself.currentnumdeftravel(self):cur=self.headerwhilecur!=None:print("{}".format(cur.item),end="")cur=cur.nextprint("\r")defadd(self,item):node=Node(item)#新节点的链接指向头节点node.next=self.header#链表的头部指向到新节点self.header=nodeself.currentnum+=1defappend(self,item):tempnode=self.headernode=Node(item)ifself.isempty():self.add(node)else:whiletempnode.next!=None:tempnode=tempnode.nexttempnode.next=nodeself.currentnum+=1definsert(self,item,index):节点=Node(item)tempnode=self.headerifindex>self.currentnum+1orindex<=0:raiseIndexError("{}isnotfindinLinklist".format(index))#指定位置为第一个即在头部插入ifindex==1:self.add(node)elifindex>self.currentnum-1:self.append(node)else:foriinrange(1,index-1):tempnode=tempnode.nextnode.next=tempnode.nexttempnode.next=nodeself.currentnum+=1defdeletebyitem(自我,项目):tempnode=self.headerprenode=Nonewhiletempnode!=None:iftempnode.item==item:iftempnode==self.header:self.header=tempnode.nextelse:prenode.next=tempnode.nextbreakelse:prenode=tempnodetempnode=tempnode.nextdefdeletebyindex(self,index):ifindex>self.currentnumorindex<=0:raiseIndexError("{}isnotfindinLinklist".format(index))i=1tempnode=self.headerprenode=self.headerifindex==1:self.header=tempnode.nextself.currentnum-=1returnwhiletempnode.nextandiself.currentnum:raiseIndexError("{}isnotfindinLinklist".format(index))临时节点=self...tempnode.nextifflag==False:return0if__name__=='__main__':a=SingleLinkList()a.add(1)#1print('a.add(1)')a.travel()a.add(2)#21print('a.add(2)')a.travel()a.append(3)#213print('a.append(3)')a.travel()a.insert(4,2)#2143print('a.insert(2,4)')a.travel()print('a.search(1)=',a.search(1))print('a.search(5)=',a.search(5))打印('a.getindex(1)=',a.getindex(1))print('a.getindex(5)=',a.getindex(5))print('a.getitem(2)=',a.getitem(2))print('a.getitem(4)=',a.getitem(4))print('a.getitem(3)=',a.getitem(3))#a.deletebyitem(5)#print('a.deletebyitem(5)')#a.travel()#a.deletebyitem(4)#print('a.deletebyitem(4)')#a.travel()#a.deletebyitem(2)#print('a.deletebyitem(2)')#a.travel()a.deletebyindex(4)print('a.deletebyindex(4)')a.travel()a.deletebyindex(2)print('a.deletebyindex(2)')a.travel()a.deletebyindex(1)print('a.deletebyindex(1)')a.travel()结果如下C:\python\pyproject\pythonalgorithms\venv\Scripts\python.exeC:/python/pyproject/pythonalgorithms/linklist.pya.add(1)1a.add(2)21a.append(3)213a.insert(2,4)2413a.search(1)=Truea.search(5)=Falsea.getindex(1)=3a.getindex(5)=0a.getitem(2)=4a.getitem(4)=3a.getitem(3)=1a.deletebyindex(4)241a.deletebyindex(2)21a。deletebyindex(1)1Processfinishedwithexitcode0链表头部加节点示意图从链表尾部加节点示意图链表