版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
郭炜信息科学技术学院数据结构与算法
(Python描述)课程信息教材数据结构与算法(Python语言实现)郭炜编著清华大学出版社另有Java语言实现,C/C++语言实现两本,均已经由清华大学出版社出版线性表3线性表线性表是一个元素构成的序列该序列有唯一的头元素和尾元素,除了头元素外,每个元素都有唯一的前驱元素,除了尾元素外,每个元素都有唯一的后继元素线性表中的元素属于相同的数据类型,即每个元素所占的空间必须相同。依据存储方式不同分为顺序表和链表两种顺序表信息科学技术学院河北草原天路顺序表即Python的列表,以及其它语言中的数组元素在内存中连续存放每个元素都有唯一序号(下标),且根据序号访问(包括读取和修改)元素的时间复杂度是O(1)的---随机访问下标为i的元素前驱下标为i-1,后继下标为i+1序号操作含义时间复杂度1init(n)生成一个n个元素的顺序表,元素值随机O(1)2init(a0,a1,....an)生成元素为a0,a1,....an的顺序表O(n)3length()求表中元素个数O(1)4append(x)在表的尾部添加一个元素xO(1)5pop()删除表尾元素O(1)6get(i)返回下标为i的元素O(1)7set(i,x)将下标为i的元素设置为xO(1)8find(x)查找元素x在表中的位置O(n)9insert(i,x)在下标i处插入元素xO(n)10remove(i)删除下标为i的元素O(n)顺序表支持的操作顺序表的append的O(1)复杂度的实现总是分配多于实际元素个数的空间(容量大于元素个数)元素个数小于容量时,append操作复杂度O(1)元素个数等于容量时,append导致重新分配空间,且要拷贝原有元素到新空间,复杂度O(n)顺序表的append的O(1)复杂度的实现重新分配空间时,新容量为旧容量的k倍(k>1且固定),可确保append操作的平均复杂度是O(1)。Python的list取k=1.2左右
链表概述信息科学技术学院宁夏中卫沙坡头链表元素在内存中并非连续存放,元素之间通过指针链接每个结点除了元素,还有next指针,指向后继不支持随机访问。访问第i个元素,复杂度为O(n)已经找到插入或删除位置的情况下,插入和删除元素的复杂度O(1),且不需要复制或移动结点有多种形式:
单链表
循环单链表
双向链表
循环双向链表单链表信息科学技术学院张掖冰沟丹霞单链表classLinkList: classNode:#表结点 def__init__(self,data,next=None): self.data,self.next=data,next def__init__(self): self.head=self.tail=None self.size=0单链表 defprintList(self):#打印全部结点 ptr=self.head whileptrisnotNone: print(ptr.data,end=",") ptr=ptr.next单链表插入元素 definsert(self,p,data):#在结点p后面插入元素
nd=LinkList.Node(data,None) ifself.tailisp:#新增的结点是新表尾
self.tail=nd nd.next=p.next p.next=nd self.size+=1单链表插入元素(1)执行nd=Node(data,None)新建结点nd单链表插入元素(2)执行nd.next=p.next单链表插入元素(3)执行p.next=nd,完成插入单链表删除元素删除p后面的元素(1)初始状态,将要删除'a'结点单链表删除元素删除p后面的元素(2)执行p.next=p.next.next,完成删除单链表删除元素 defdelete(self,p):#删除p后面的结点
ifself.tailisp.next: self.tail=p p.next=p.next.next self.size-=1
#结点空间会被Python自动回收判断变量是否为None,应写pisNone,pisnotNone最好不要写p==None,p!=None单链表 defpopFront(self):#删除前端元素 ifself.headisNone: raise\ Exception("PoppingfrontforEmptylinklist.") else: self.head=self.head.next self.size-=1 ifself.size==0: self.head=self.tail=None defpushBack(self,data):#在尾部添加元素 ifself.size==0: self.pushFront(data) else: self.insert(self.tail,data)单链表 defpushFront(self,data):#在链表前端插入一个元素data nd=LinkList.Node(data,self.head) self.head=nd self.size+=1 ifself.tailisNone: self.tail=nd单链表 defclear(self): self.head=self.tail=None self.size=0 def__iter__(self): self.ptr=self.head returnself def__next__(self): ifself.ptrisNone: raiseStopIteration()#引发异常
else: data=self.ptr.data self.ptr=self.ptr.next returndata单链表linkLst=LinkList()linkLst.pushFront(0)linkLst.pushFront(1)foriinrange(2,5): linkLst.pushBack(i)forxinlinkLst: #>>1,0,2,3,4, print(x,end=",")上述实现方式没有实现“隐藏”,不是很好的实现方式带头结点的单链表带头结点的空单链表为避免链表为空是做特殊处理,可以为链表增加一个空闲头结点带头结点的非空单链表带头结点的单链表构造函数:classLinkList: def__init__(self): self.head=self.tail=LinkList.Node(None,None) self.size=0为避免链表为空是做特殊处理,可以为链表增加一个空闲头结点循环单链表'a'1813tailsizetailsize空表tail.next即头结点循环单链表在表首或表尾添加元素,以及删除表首元素,复杂度都是O(1)的。双向链表信息科学技术学院张掖平山湖大峡谷双向链表(双链表)每个结点有next指针指向后继,有prev指针指向前驱带头结点的双向链表classDoubleLinkList: class_Node: def__init__(self,data,prev=None,next=None): self.data,self.prev,self.next=data,prev,next双向链表插入结点在结点p后面插入新结点nd(1)执行nd=Node(data,None,None)新建结点nd双向链表插入结点在结点p后面插入新结点nd(2)执行nd.prev,nd.next=p,p.next双向链表插入结点在结点p后面插入新结点nd
(3)执行p.next.prev=nd双向链表插入结点在结点p后面插入新结点nd
(4)执行p.next=nd,插入完成双向链表删除结点删除结点p(1)初始状态,将要删除'a'结点双向链表删除结点删除结点p(2)执行p.prev.next=p.next双向链表删除结点删除结点p(3)执行p.nex.prev=p.prev,完成删除双向链表实现classDoubleLinkList: class_Node: def__init__(self,data,prev=None,next=None): self.data,self.prev,self.next=data,prev,next class_Iterator: def__init__(self,p): self.ptr=p defgetData(self): returnself.ptr.data defsetData(self,data): self.ptr.data=data def__next__(self): self.ptr=self.ptr.next ifself.ptrisNone: returnNone else: returnDoubleLinkList._Iterator(self.ptr)双向链表实现 defprev(self): self.ptr=self.ptr.prev returnDoubleLinkList._Iterator(self.ptr) def__init__(self): self._head=self._tail=\ DoubleLinkList._Node(None,None,None) self._size=0 def_insert(self,p,data): nd=DoubleLinkList._Node(data,p,p.next) ifself._tailisp:#新增的结点是新表尾
self._tail=nd ifp.next: p.next.prev=nd p.next=nd self._size+=1双向链表实现 def_delete(self,p):#删除结点p ifself._size==0orpisself._head: raiseException("Illegaldeleting.") else: p.prev.next=p.next ifp.next:#如果p有后继
p.next.prev=p.prev ifself._tailisp: self._tail=p.prev self._size-=1 defclear(self): self._tail=self._head self._head.next=self._head.prev=None self.size=0 defbegin(self): returnDoubleLinkList._Iterator(self._head.next) defend(self): returnNone双向链表实现 definsert(self,i,data):#在迭代器i指向的结点后面插入元素
self._insert(i.ptr,data) defdelete(self,i):#删除迭代器i指向的结点
self._delete(i.ptr) defpushFront(self,data):#在链表前端插入一个元素
self._insert(self._head,data) defpopFront(self): self._delete(self._head.next) defpushBack(self,data): self._insert(self._tail,data) defpopBack(self): self._delete(self._tail) def__iter__(self): self.ptr=self._head.next returnself双向链表实现 def__next__(self): ifself.ptrisNone: raiseStopIteration()#引发异常
else: data=self.ptr.data self.ptr=self.ptr.next returndata deffind(self,val):#查找元素val,找到返回迭代器,找不到返回None ptr=self._head.next whileptrisnotNone: ifptr.data==val: returnDoubleLinkList._Iterator(ptr) ptr=ptr.next returnself.end()双向链表实现 defprintList(self): ptr=self._head.next whileptrisnotNone: print(ptr.data,end=",") ptr=ptr.nextlinkLst=DoubleLinkList()foriinrange(5): linkLst.pushBack(i)i=linkLst.begin()whilei!=linkLst.end():#>>0,1,2,3,4, print(i.getD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2027届河北省保定市高碑店六年级数学第一学期期末经典模拟试题含解析
- 2027届长治市长治县数学三上期末复习检测试题含解析
- 云南省丽江地区华坪县2027届数学三年级第一学期期末教学质量检测模拟试题含解析
- 人教版小学五年级数学下册总复习《统计》示范课教案
- 杭州市拱墅区2027届六年级数学第一学期期末联考试题含解析
- 2027届宁德市寿宁县数学六年级第一学期期末统考模拟试题含解析
- 2027届陕西省商洛市洛南县数学六年级第一学期期末调研试题含解析
- 武陟县2027届数学三上期末质量检测模拟试题含解析
- 2026中国洗衣机APP用户粘性提升与生态服务变现路径研究
- 2026汽车轮胎制造业市场分析及技术革新与应用方向与投资发展研究报告
- 2025年山东省春季高考数学试卷试题真题(含答案解析)
- 质量安全员培训课件
- 违法分包培训
- 医院中央空调档案制度
- DB3202∕T 1050-2023 物流园区叉车安全管理规范
- 机关事务财务管理工作总结
- 广州市房屋租赁合同2016标准版-A3一张打印可用于更改临商
- 内分泌系统评估大纲
- 富滇银行考试真题及答案网盘
- JJF电子0065─2021固体继电器测试仪校准规范
- DB42∕T 685-2020 湖北省建设项目交通影响评价技术规范
评论
0/150
提交评论