大家好,上一期我们分享了顺序表有关部分的内容,那么在这一期我们将分享的是python中链表这种数据结构的内容。
本文目录
1、链表基本知识引入
2、单链表
3、单链表与顺序表的对比
链表引入
- 为什么引入链表
外部原因来说,顺序表每次申请时需要一块连续的存储空间,而在扩充时需要进行数据的搬迁,地址管理用起来不灵活。
而对链表本身而言,使用链表的结构能够充分利用计算机内存空间,实现灵活的内存动态管理,特别是链表在容量扩充上非常方便,只需要改变指针指向即可。
- 链表的定义
链表(Linked list)是一种常见的数据结构,是一种线性表,但不像顺序表一样在连续地址存放数据,而是在每一个节点(数据存储单元,分为数据域和下一地址域)里存放下一个节点的位置信息(地址)。
单链表
单链表是最简单的一种链表形式,每一个节点包含数据域和下一地址域。并且这个节点指向链表中的下一个节点,最后一个节点的下一地址域指向空值。
- 识记:
1、表元素elem用来存放具体的数据
2、下一地址域next用来存放下一个节点的位置信息(python中的标识)
3、变量p指向头结点的位置,从此节点出发能找到链表中任意节点
- 单链表的操作
1、is_empty()判断是否为空
2、length()求链表长度
3、travel()遍历整个链表
4、add(item)链表头部添加元素
5、append(item)链表尾部添加元素
6、insert(index,item)指定位置添加元素
7、remove(item)删除节点
8、search(item)查找节点是否存在
- 代码实现
#链表的节点实现,用一个类对象表示一个节点class SingleNode(object): #单链表节点信息 def __init__(self,item): self.item=item#数据域 self.next=None#下一地址域#声明一个单链表类,用于封装单链表的各种方法class SingleLinkedList(object): #初始化 def __init__(self,node=None): self._head=None#定义头节点 #判断链表是否为空 def is_empty(self): return self._head==None #判断链表的长度 def length(self): curl = self._head # 定义游标指针 count = 0 while curl != None: count += 1 curl = curl.next return count #遍历单链表 def travel(self): curl=self._head#定义游标指针 count=0 while curl!=None: print(curl.item,end=" ") count+=1 curl=curl.next #链表头部添加元素,头插法 def add(self,item): node=SingleNode(item) node.next=self._head self._head=node #链表尾部添加元素 def append(self,item): #new一个节点 node=SingleNode(item) #链表为空或不为空,单独判断 if self.is_empty(): self._head=node return else: curl=self._head while curl.next!=None: curl=curl.next curl.next=node #指定位置添加元素,范围应该是从0到链表长度+1 def insert(self,index,item): #根据要插入的位置进行不同的插入操作 if index<=1: self.add(item) elif index>(self.length()): self.append(item) else: pre=self._head count=1 while count